Должна ли каждая таблица иметь первичный ключ? - PullRequest
6 голосов
/ 15 августа 2011

Я где-то читал, что каждая таблица должна иметь первичный ключ для выполнения 1NF.

У меня есть таблица tbl_friendship.

В таблице есть 2 поля: Владелец и Друг.

Поля владельца и друзей являются внешними ключами поля идентификатора автоинкремента в tbl_user.

Должен ли этот tbl_friendship иметь первичный ключ?Должен ли я создать поле идентификатора автоинкремента в tbl_friendship и сделать его первичным ключом?

Ответы [ 7 ]

6 голосов
/ 15 августа 2011

Первичные ключи могут применяться к нескольким столбцам!В вашем примере первичный ключ должен быть в обоих столбцах, например (Владелец, Друг).Особенно, когда владелец и друг являются внешними ключами таблицы пользователей, а не фактическими именами (лично мои столбцы идентификаторов используют соглашение об именах «Id», и поэтому я хотел бы (OwnerId, FriendId)

Лично я считаю,Таблица должна иметь первичный ключ, но вы найдете других, кто не согласен.

Вот статья, которую я написал на тему нормальных форм. http://michaeljswart.com/2011/01/ridiculously-unnormalized-database-schemas-part-zero/

4 голосов
/ 15 августа 2011

Да, у каждой таблицы должен быть первичный ключ.

Да, вы должны создать суррогатный ключ. Также известен как поле pk с автоинкрементом.

Вы также должны сделать «Друг» FK для этого поля автоинкремента.


Если вы думаете, что в будущем собираетесь «перепроверять», возможно, вы захотите изучить использование естественных ключей, которые являются полями, которые естественным образом идентифицируют ваши данные. Ключом к этому является то, что при кодировании всегда используются естественные идентификаторы, а затем вы создаете уникальные индексы для этих естественных ключей. В будущем, если вам придется повторно ввести ключ, вы можете это сделать, потому что ваш UX гарантирует, что ваши данные непротиворечивы.

Я бы сделал это только в том случае, если вам это абсолютно необходимо, поскольку это увеличивает сложность вашего кода и модели данных.

3 голосов
/ 15 августа 2011

Из вашего описания не ясно, но являются ли внешние ключи владельца и друга, и может быть только одна связь между любой парой? Это делает два столбца внешнего ключа идеальным кандидатом для естественного первичного ключа.

Другой вариант - использовать суррогатный ключ (дополнительный автоинкрементный столбец, как вы предложили). Взгляните здесь для углубленного обсуждения.

2 голосов
/ 15 августа 2011

Первичный ключ также может быть чем-то абстрактным. В этом случае каждый кортеж (владелец, друг), например («Дейв», «Мэтт») может образовывать уникальную запись и, следовательно, быть вашим основным ключом. В этом случае было бы полезно использовать не имена, а ключи, ссылающиеся на другую таблицу. Если вы гарантируете, что эти кортежи не могут иметь дубликаты, у вас есть действительный первичный ключ.

По причинам обработки может быть полезно ввести специальный первичный ключ, такой как поле автоинкремента (например, в MySQL) или использовать последовательность с Oracle.

1 голос
/ 15 августа 2011

Чтобы соответствовать 1NF (что не совсем соответствует тому, что определяет 1NF), да, у вас должен быть первичный ключ, идентифицированный в каждой таблице.Это необходимо для обеспечения уникальности каждой записи.

http://en.wikipedia.org/wiki/First_normal_form

Как правило, первичный ключ можно создать многими способами, одним из которых является наличие столбца с автоинкрементомдругой - иметь столбец с идентификаторами GUID, другой - иметь два или более столбцов, которые однозначно идентифицируют строку при их объединении.

0 голосов
/ 16 августа 2011

Да, каждая таблица должна иметь (хотя бы один) ключ.Дублирование строк в любой таблице нежелательно по многим причинам, поэтому наложите ограничение на эти два столбца.

0 голосов
/ 15 августа 2011

В долгосрочной перспективе с вашей таблицей будет намного легче управлять, если у нее есть первичный ключ.По крайней мере, вам нужно однозначно идентифицировать каждую запись в таблице.Поле, которое используется для уникальной идентификации каждой записи, также может быть первичным ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...