Дублирование внешнего ключа? - PullRequest
3 голосов
/ 04 апреля 2011

Вероятно, простой ответ здесь, я надеюсь, но кажется сложным вопросом, который можно выразить словами.

Если у вас есть внешний ключ, который, по сути, появляется дважды в таблице, то это делается из двух составных ключей.FK затем должен быть определен дважды (существует как два отдельных атрибута)?

Вот несколько простых моделей для визуализации того, что я спрашиваю.Ex.1 показывает FK Table1Id в качестве одного атрибута.Ex.2 показывает FK для Table1Id (идентифицированного как Table1Id_FKTable2 и Table1Id_FKTable3) как два разных атрибута.

В зависимости от того, что вы хотите достичь, допустимы ли обе эти модели?enter image description here

Ответы [ 3 ]

3 голосов
/ 04 апреля 2011

Обычно table1ID_FKTable2 лучше назвать "ролью", которую Таблица1 играет в отношении Таблицы 4.

И, аналогично, table1ID_FKTable3 - это другая "роль", которую Таблица1 играет в отношении Таблицы4.

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

0 голосов
/ 04 апреля 2011

Ваши рисунки не "визуализируют то, что вы спрашиваете", потому что ваши рисунки вообще не содержат никаких составных ключей.

Но если ваш вопрос (что-то вроде) "Может ли один единственный атрибут вtable4 будет объявлен как внешний ключ ОБА в table2 и table3? ", тогда ответ - да.

Маловероятно, если он сработает так, как вы бы хотели, есливы используете повсеместно поля идентификаторов, но ни реляционная модель, ни даже стандарт SQL не мешают этому.

0 голосов
/ 04 апреля 2011

Я пытаюсь разобраться в вашем вопросе, но если первичный ключ Table2 является составной частью Table1Id и Table2Id, то вам нужно создать внешний ключ из Table4, используя оба поля.То же самое для Table3.

ALTER TABLE Table4 ADD constraint fk_tab2 foreign key references Table2(Table1Id, Table2Id)
ALTER TABLE Table4 ADD constraint fk_tab3 foreign key references Table3(Table1Id, Table3Id)
...