复合主键和链接表规则

时间:2014-09-12 11:23:04

标签: sql sql-server database

我与链接表有很多关系,我需要规范化规则集。以下是我的问题:

左(L)和右(R)(L& R)表:两者都有复合(感谢stakx用于纠正我)主键。链接表具有其自己的主键,但显然,因为L& R表具有每个复合原色,所以链接表必须包含多个外键。没问题。即。

L Table:
LID       (int)      PK1
LSomeDate (DateTime) PK2
Other Fields...

R Table:
RID       (int)      PK1
RSomeDate (DateTime) PK2
Other Fields...

Link Table:
ID        (int)      PK
LID       (int)      FK1
LSomeDate (DateTime) FK1
RID       (int)      FK2
RSomeDate (DateTime) FK2

要求1:任何一个表中的实体都可以不存在另一个。因此,在M:M的两侧,我们应该有一个0:M而不是1:M。我猜测(也许是错误的)这意味着我必须留下链接表外键null。但是,如果我这样做,我可以输入说LID并将LSomeDate字段保留为空。或相反亦然。与RID和RSomeDate一样。

我的第一个问题是,创建一些"标准方法是什么(规则,约束,默认,触发器等)"如果输入了LSomeDate,则会强制用户输入LID;如果输入了LID,则会输入LSomeDate。然后我可以将它应用于R FK。这样可以防止在FK的一部分中留下空值。

基本上...... FK的整个L侧为空,或两个字段都填满(有效的ref)。同样对于R而言,这将是分开的。

我的另一个问题是......在创建链接表时,L表应该包含右表的FKID,反之亦然,例如......上面的L表还应该包含RID和RSomeDate作为外​​键,以及在R表上反之亦然,或者在链表中指定了这些内容。

提前致谢。

1 个答案:

答案 0 :(得分:1)

在链接表中输入条目的唯一原因是将一个L记录链接到另一个R记录。如果一个L存在而没有链接到任何R,那么L中有一个recird,但是在链接表中没有L和R的特定组合的条目。

即,只有当L和R相关联时,N:N链接表中的条目才存在。也就是说,如果两个记录L和R没有链接(“一个没有另一个存在”),那么在链接表中就不会有条目。因此,链接表中甚至不需要NULL值。

意思是,理想情况下,所有链接表列都声明为NOT NULL;突然你的问题消失了!

(这顺便说一句,你的主键是复合的;同样的事实也适用于非复合键。)

如果您,尽管如此,仍然希望声明这些列NULL能够,并且您希望在数据库级别确保例如您的链接表中的所有L个外键不是部分NULL,您可以添加CHECK约束:

ALTER TABLE LinkTable
ADD CONSTRAINT CK_LinkTable_LID_LSomeDate
CHECK ((LID IS NULL     AND LSomeDate IS NULL    ) 
    OR (LID IS NOT NULL AND LSomeDate IS NOT NULL))

但是,如果所有这些外键列首先都是NOT NULL,那将会无限好,因为这就是N:N链接表的设计方式。