2010-02-10 2 views
3

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

Предположим, у меня есть три стола, 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).

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

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

+0

У таблицы A и B есть отношения «один ко многим»? –

+0

Да, таблица A может иметь несколько экземпляров таблицы B ...извините, я забыл указать на это – kim

ответ

6

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

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

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

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

+0

Спасибо .. Я немного смущен. Я понимаю ваш первый момент: любой данный экземпляр C может быть связан с A OR B (не для обоих). Я не мог придумать хорошего решения (и просто предположил, что в коде я бы проверил оба столбца и использовал тот, который не является нулевым). Это то, с чем вы столкнулись со своим вторым моментом? – kim

+0

Но A связано со многими C. В качестве примера Table A может быть сообщение в блоге, а таблица C - комментарий. Поэтому у каждого сообщения в блоге может быть много комментариев. – kim

+0

@kim: Что такое B в вашем примере? –

3

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

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

См. this article о реализации такого рода отношений для PHP и MySQL.

+0

«Это предусмотрено, что сущность требует, чтобы все ссылки существовали» - поэтому, если это требование отсутствует, что бы вы порекомендовали? – kim

+0

Я бы создал отдельную таблицу для каждого из столбцов, которые не всегда существуют. – Oded

2

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

3

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

1

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

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