复合主键和链接表规则

弗朗西斯·罗杰斯

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

左(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表,或者在链接表中已足够指定这些表。

提前致谢。

stakx-不再贡献

在链接表中具有条目的唯一原因是将一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章