Композитные внешние ключи - PullRequest
0 голосов
/ 23 декабря 2009

Для меня это очень важно. В SQL Server 2008 у меня есть 3 таблицы. 2 с уникальными ключами и 1, который является отображением между ними. Пример:

People    Events   Schedule
------    ------   --------
PersonId  EventId  ScheduleId
Name      Place    PersonId
                   EventId
                   Rsvp

ScheduleId не требуется, если я создаю составной ключ. Я знаю, как сделать составной ключ, как этот

ALTER TABLE Schedule ADD CONSTRAINT CK_Schedule_PersonId_EventId
UNIQUE NONCLUSTERED (PersonId, EventId)

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

Ответы [ 2 ]

4 голосов
/ 23 декабря 2009

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

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

PersonId int FOREIGN KEY REFERENCES People(PersonId)

или

CONSTRAINT fk_PersonId FOREIGN KEY (PersonId) REFERENCES People(PersonId)

или если вы изменяете существующую таблицу

ALTER TABLE Schedule ADD CONSTRAINT fk_PersonId
FOREIGN KEY (PersonId) REFERENCES People(PersonId)

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

CONSTRAINT pk_Person_Event PRIMARY KEY (PersonId, EventId)
1 голос
/ 23 декабря 2009

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

...