我与链接表有很多对很多的关系,我需要对规则集进行形式化。以下是我的问题:
左(L)和右(R)(L&R)表:都具有复合主键(感谢stakx来纠正我)。链接表具有其自己的主键,但是显然,由于L&R表具有每个组合主键,因此链接表必须包含多个外键。没问题。IE
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。我猜测(也许是错误的)这意味着我必须将链接表外键保留为空。但是,如果执行此操作,则可以输入“ LID”,而将LSomeDate字段保留为空。或相反亦然。RID和RSomeDate也是如此。
我的第一个问题是,创建一些“任何内容(规则,约束,默认值,触发器等)”的标准方法是什么,如果输入了LSomeDate,它将迫使用户输入LID;如果输入了LID,则将迫使用户输入LSomeDate。然后,我可以将其应用于R FK。这将防止在FK的一部分中留下空值。
本质上...要么FK的整个L边为空,要么两个字段都被填充(有效的引用)。对于R同样如此,但这将是分开的。
我的另一个问题是...例如,在创建链接表时,L表是否应包含右表的FKID,反之亦然,例如...上面的L表是否还应包含RID和RSomeDate作为外键,反之亦然。 R表,或者在链接表中已足够指定这些表。
提前致谢。
在链接表中具有条目的唯一原因是将一个L记录链接到另一个R记录。如果一个L存在而没有链接到任何R,则L中存在一个reird,但是在链接表中将没有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链接表的方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句