列与(许多可能的一个)表之间的SQL引用完整性

时间:2010-07-15 21:10:13

标签: sql database foreign-keys

目前这更像是一种好奇心,但让我们描绘一个环境,在这个环境中我会以坚定的镍币和硬币为基础。我的系统有很多操作,而且它们都是可计费的。所有这些操作都记录在各个表中(这些表需要分开,因为它们记录了非常不同类型的信息)。我还想微观管理我的应收账款。 (如果您发现此处存在不一致之处,请原谅我,因为此示例不是真实情况)

是否有一种标准的方法可以用一些东西替换外键,这种方法可以验证我的记帐表中X列中的标识符是许多操作记录表中的一个中的现有标识符?

一个想法是,在记录帐户活动时,我可以引用操作的标识符以及操作(特别是它所在的表)并使用CHECK约束。这可能是最好的方式,以便我的期刊不含糊不清。

还有其他方法可以解决这个问题吗,事实上还是专有的?

非关系数据库是否解决了这个问题?

修改

重新解释我最初的问题,

是否有一种标准的方法可以用一些东西来替换外键,这种方法可以验证我的记帐表中第X列中的标识符是多个(但不一定是所有)中的一个中的现有标识符操作记录表?

3 个答案:

答案 0 :(得分:3)

不,使用单个外键列无法实现此目的。

你基本上可以做两件事之一:

    在你的表中可能引用任何其他x表的
  • ,有x个外键引用字段(理想情况下:类型为INT的ID),在任何给定时间只有一个非NULL。每个FK参考键恰好引用了您的其他数据表

或:

  • 每个主表都有一个“子”表,并带有适当的强制引用,并将这n个子表中的数据汇总到一个视图(而不是表格)中进行报告/计费。

或者完全忘记参照完整性 - 我肯定推荐!

答案 1 :(得分:2)

答案 2 :(得分:1)

另一种方法是通过触发器强制执行复杂的参照完整性规则。然而,并且不知道您的设计究竟是什么,通常在询问这些类型的问题时,它是围绕一个糟糕的设计。首先看看设计,看看你是否可以改变它来制作可以通过FK处理的东西,它们比通过触发器做这种事情更容易管理。

如果您确实采用了触发路径,请不要忘记强制执行更新以及插入,并确保您的触发器可以使用基于集合的多行插入和更新来正常工作。

设计替代方案是拥有amaster表,该表是所有表的父表,具有不同的详细信息,并使用FK。