Имеют ли смысл несколько внешних ключей? - PullRequest
3 голосов
/ 10 февраля 2010

Может ли смысл иметь одну таблицу для нескольких внешних ключей?

Предположим, у меня есть три таблицы: Table A, Table B и Table C. Если я думаю о таблицах как об объектах (и они сопоставлены с объектами в моем коде), то обе таблицы A и B имеют отношение много к одному с таблицей C. I.e. Каждая из таблиц / объектов A и B может иметь много экземпляров C. Таким образом, я спроектировал это так, что Table C указывает на первичный ключ в Table A и Table B: другими словами, Table C имеет 2 внешних ключи (a_Id и b_Id).

Редактировать : Я забыл упомянуть также, что Table A может иметь много экземпляров Table B. Так что Table B имеет внешний ключ в таблицу A. Если это имеет значение ...

Мне интересно, имеет ли это смысл или есть лучший способ сделать это? Спасибо.

Ответы [ 5 ]

6 голосов
/ 10 февраля 2010

Это хорошо, но учтите, что это имеет смысл, только если C всегда должен иметь в качестве пары и A, и B.

Если вы просто хотите, чтобы А имели С и В, чтобы иметь С, но А и В не связаны между собой, вы должны поместить внешний ключ в А и В и позволить ему обнуляться.

Обновление: после прояснения кажется, что вам нужны два отдельных отношения: A может иметь много C, и B может иметь много C, но C может принадлежать только одному A или одному B.

Решение: это два отдельных отношения «один ко многим», поэтому создайте две новые таблицы A_C и B_C и поместите туда внешние ключи. A_C содержит внешний ключ для A и внешний ключ для C. Аналогично для B_C.

3 голосов
/ 10 февраля 2010

Если вы не можете сформулировать отношения между объектами A, B, C каким-либо иным способом, имеет смысл определить FK, как вы.

3 голосов
/ 10 февраля 2010

В вашем сценарии, из двух разных таблиц, на которые ссылается третья, это тоже хорошо. У меня есть таблицы в моих базах данных, которые имеют 3-4 или даже больше внешних ключей. Это при условии, что сущность всегда требует, чтобы все ссылки существовали.

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

См. эту статью о реализации такого рода отношений для PHP и MySQL.

2 голосов
/ 10 февраля 2010

Да, это имеет смысл. Нередко встречается таблица с несколькими внешними ключами для других таблиц.

1 голос
/ 10 февраля 2010

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

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

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