我与链接表有很多关系,我需要规范化规则集。以下是我的问题:
左(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表上反之亦然,或者在链表中指定了这些内容。
提前致谢。
答案 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链接表的设计方式。