复合外键

时间:2009-12-23 17:28:48

标签: sql database-design schema

这对我来说很重要。在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 个答案:

答案 0 :(得分:4)

ScheduleId通常是ORM的首选,它提供了一个代表记录的绝对唯一且不可更改的主键。主键不应更改。它还使处理记录更容易一些。您只需要为更新或删除提供id,而不是传递复合标识符。

您可以在执行Schedule:

定义时创建外键
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,那么你应该把它作为主键,以确保它不仅是唯一的而且不是null。

CONSTRAINT pk_Person_Event PRIMARY KEY (PersonId, EventId)

答案 1 :(得分:1)

由于数据库的可扩展性,我不会在这种情况下使用复合键。 假设你的表中有6个外键(Schedule),并且在其他一些表中使用了ScheduleId,那么我将不会在即将到来的表中使用所有6个外键。我将尝试使用ScheduleId作为我的外键。