Возьмите три уровня информации:
Уровень 1: информация
Этот слой содержит данные с естественными индексами UNIQUE
и суррогатным ключом, который легко переносится.
Table Surnames:
+-----------------------------+--------------+
| ID (Auto Increment, PK) | Surname |
+-----------------------------+--------------+
| 1 | Smith |
| 2 | Edwards |
| 3 | Brown |
+-----------------------------+--------------+
Table FirstNames
+-----------------------------+--------------+
| ID (Auto Increment, PK) | FirstName |
+-----------------------------+--------------+
| 1 | John |
| 2 | Bob |
| 3 | Mary |
| 4 | Kate |
+-----------------------------+--------------+
Натуральные клавиши
В качестве альтернативы, две приведенные выше таблицы могут быть без ID
и использовать фамилию и имя FirstName как естественные первичные ключи, как объяснил Майк Шеррилл. В этом случае предположим, что слой ниже ссылок varchar
, а не int
.
Уровень 2: Люди
В этом слое используется составной индекс. Это значение может быть UNIQUE
или PRIMARY
, в зависимости от того, используется ли суррогатная клавиша в качестве Первичного ключа.
+-----------------+--------------+
| FirstName | LastName |
+-----------------+--------------+
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
| 3 | 1 |
| 4 | 2 |
| ... | ... |
+-----------------+--------------+
Уровень 3: родители
В этом слое отношения между людьми исследуются через таблицу ParentsOf
.
ParentsOf
+-----------------+-----------------+
| Person | PersonParent |
+-----------------+-----------------+
OR
+-----------------+-----------------+-----------------+-----------------+
| PersonFirstName | PersonSurname | ParentFirstName | ParentSurname |
+-----------------+-----------------+-----------------+-----------------+
Вопрос
Предполагая, что ссылочная целостность ОЧЕНЬ важна для меня в самом ее ядре, и у меня будет FOREIGN KEYS
по этим индексам, чтобы я сохранил базу данных, ответственную за мониторинг ее собственной целостности на этом фронте, и что, если бы я был используйте ORM, это было бы похоже на Doctrine, у которого есть встроенная поддержка Compound Primary Keys...
Пожалуйста, помогите мне понять:
-
Список компромиссов, которые имеют место с использованием суррогатных ключей против естественных ключей на 1-м слое.
-
Список компромиссов, которые происходят с использованием сложных ключей и суррогатных ключей на втором слое, которые могут быть перенесены на 3-й уровень.
Мне не интересно слышать, что лучше, потому что я понимаю, что среди профессионалов есть серьезные разногласия по этой теме, и это будет причиной религиозной войны. Вместо этого я прошу, очень просто и объективно, насколько это возможно по-человечески, какие компромиссы вы будете принимать, передавая суррогатные ключи каждому слою и поддерживая первичные ключи (естественные/составные, или суррогатные/композитные). Любой сможет найти кого-то, кто говорит НИКОГДА или ВСЕГДА использовать суррогатные ключи на SO и других сайтах. Вместо этого, мотивированный анализ компромиссов - это то, что я больше всего ценю в ваших ответах.
EDIT: Было указано, что пример фамилии является плохим примером использования 6NF. Ради сохранения неповрежденного вопроса, я собираюсь это оставить. Если у вас возникли проблемы с представлением об этом прецедента, лучшим может быть список "Продуктов бакалеи". AKA:
+-----------------------------+--------------+
| ID (Auto Increment, PK) | Grocery |
+-----------------------------+--------------+
| 1 | Sponges |
| 2 | Tomato Soup |
| 3 | Ice Cream |
| 4 | Lemons |
| 5 | Strawberries |
| 6 | Whipped Cream|
+-----------------------------+--------------+
+-----------------------------+--------------+
| ID (Auto Increment, PK) | Brand |
+-----------------------------+--------------+
| 1 | Bright |
| 2 | Ben & Jerry's|
| 3 | Store Brand |
| 4 | Campbell |
| 5 | Cool Whip |
+-----------------------------+--------------+
Пример натурального композитного ключа:
+-----------------------------+--------------+
| Grocery | Brand |
+-----------------------------+--------------+
| Sponges | Bright |
| Ice Cream | Ben & Jerry's|
| Ice Cream | Store Brand |
| Tomato Soup | Campbell |
| Tomato Soup | Store Brand |
| Lemons | Store Brand |
| Whipped Cream | Cool Whip |
+-----------------------------+--------------+
Рекомендуемые пары
+-----------------+-----------------+-----------------+-----------------+
| Grocery1 | Brand1 | Grocery2 | Brand2 |
+-----------------+-----------------+-----------------+-----------------+
Повторяю, это также просто пример. Это не то, как я бы рекомендовал продолжить, но это должно помочь проиллюстрировать мой вопрос.
Там не хватает этого метода. Я повторю, что этот вопрос заключался в том, чтобы просить пройти через преимущества и недостатки каждого метода ниже, а не выделять его лучше, чем другой. Я считаю, что большинство людей смогли заглянуть мимо сомнительного характера этого конкретного примера, чтобы ответить на главный вопрос. Это редактирование для тех, кто не может.
Ниже приведены некоторые очень хорошие ответы, и если вам интересно, в каком направлении идти, прочитайте их.
END EDIT
Спасибо!