2009-12-23 145 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的首选,它提供了一个绝对唯一且不可更改的主键,代表一条记录。主键不应该改变。它也使处理记录更容易一些。你只需要给id一个更新或删除,而不是传入一个复合标识符。

您可以创建,当你正在做的定义日程安排外键:

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,那么你应该把它作为确保我的主要关键t不仅是唯一的,而且不是空的。

CONSTRAINT pk_Person_Event PRIMARY KEY (PersonId, EventId) 
+0

您是否认为我应该使用带约束的单个主键来防止重复配对,还是应该让我的业务逻辑强制执行? – Dinah 2009-12-23 17:51:27

+1

+1:'scheduleid'也被懒惰的程序员使用,懒惰的程序员根本不想为主键引用2+列的麻烦。另外,组合键不一定是主键,但是这个例子就是这种情况。 – 2009-12-23 17:51:36

+1

@Dinah:单列主键和伴随的唯一约束是过度复杂的情况。如果没有使用单列主键,则将组合键设为主键。 – 2009-12-23 17:53:12

1

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