【发布时间】:2014-09-12 19:54:48
【问题描述】:
我与链接表有多对多关系,我需要形式化一个规则集。以下是我的问题:
左 (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。我猜测(可能是错误的)这意味着我必须将链接表外键保留为空。但如果我这样做,我可以输入 LID 并将 LSomeDate 字段留空。或相反亦然。 RID 和 RSomeDate 也是如此。
我的第一个问题是,创建一些“任何内容(规则、约束、默认值、触发器等)”的标准方法是什么被输入。然后我可以将其应用于 R FK。这将防止在 FK 的一部分中留下空值。
本质上...FK 的整个 L 侧为空,或者两个字段都已填充(有效的参考)。对于 R 也是如此,但这将是分开的。
我的另一个问题是......创建链接表时,L表是否应该包含右表的FKID,反之亦然,例如......上面的L表是否也应该包含RID和RSomeDate作为外键,以及在 R 表上反之亦然,或者说这些都在链接表中指定就足够了。
提前致谢。
【问题讨论】:
-
关于术语的旁注:虽然一个表可以有多个候选键,但它们只能有一个主键。然而,这个主键可能是一个复合键(即由多于一列组成)。我假设您的意思是说您的 L 和 R 表都有一个复合主键?
-
@stakx - 我做到了,并更新了问题。谢谢。 :)
-
你说的“…强制用户输入…ID”是什么意思?用户是否直接插入数据库?也就是说,您想直接在数据库级别还是在应用程序级别执行此规则?
-
我正在建数据库,所以还没有开始app dev。我的想法是,由于这是一个数据库问题(与业务逻辑相反),它应该由数据库处理,如果两者都不正确,数据库应该抛出一个可以在应用程序级别捕获的错误。用户可能无法在链接表中输入数据(希望如此),但我想在这里抓住它,因为这意味着更少的代码,我觉得确保数据准确是一个数据库问题。
标签: sql sql-server database