2009-12-23 6 views
0

Это очень много для меня. В 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, скажите почему.

ответ

4

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, вы должны сделать его первичным ключом, чтобы убедиться, что i t не только уникален, но не равен нулю.

CONSTRAINT pk_Person_Event PRIMARY KEY (PersonId, EventId) 
+0

Как вы думаете, я должен использовать один первичный ключ с ограничением для предотвращения дублирования спаривания или оставить его для моей бизнес-логики для обеспечения соблюдения? – Dinah

+1

+1: «schedid» также используется ленивым программистом, который просто не хочет нервотрепки ссылок на столбцы 2+ для первичного ключа. Кроме того, составной ключ не должен быть первичным ключом, но это имеет место для этого примера. –

+1

@ Dinah: первичный ключ с одним столбцом и сопутствующие уникальные ограничения являются чрезмерно сложными. Если для первичного ключа одного столбца не используется, сделайте составной первичный ключ. –

1

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

Смежные вопросы