【问题标题】:SQL Referencial Integrity Between a Column and (One of Many Possible) Tables列和(许多可能之一)表之间的 SQL 引用完整性
【发布时间】:2010-07-15 21:10:13
【问题描述】:

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

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

一个想法是,在记录帐户活动时,我可以引用操作的标识符以及操作(特别是它所在的表)并使用 CHECK 约束。这可能是最好的方法,这样我的日记就不会模棱两可了。

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

非关系型数据库能解决这个问题吗?

编辑:

重新表述我最初的问题,

是否有某种标准的方法可以用可以验证我的帐单表上 X 列中的标识符是多个(但不一定是全部)之一中的现有标识符替换外键的方法操作记录表?

【问题讨论】:

  • 你所描述的是正是外键的全部意义 - 那么你为什么要避免这种情况呢?不,真的没有其他选择 - 外键正是为此目的而设计的 - 使用它们!

标签: sql database foreign-keys


【解决方案1】:

不,没有办法使用单个外键列来实现这一点。

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

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

或:

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

或者完全忘记参照完整性 - 我绝对推荐!

【讨论】:

  • 我同意你所说的,除了我正在寻找外键的替代品来检查完整性。虽然 OMG Ponies 告诉我不能用 CHECK 来完成,但现在我完全不知所措了。我真的不想添加几十个可以为空的 FK 列来满足所有可能的操作。
【解决方案2】:

【讨论】:

    【解决方案3】:

    另一种方法是通过触发器强制执行复杂的参照完整性规则。然而,由于不知道你的设计到底是什么,通常当这些类型的问题被问到时,它是为了解决一个糟糕的设计。先看看设计,看看你能不能改变它,让它可以通过 FK 来处理,它们比通过触发器做这种事情更容易管理。

    如果您确实采用了触发器路线,请不要忘记强制执行更新和插入,并确保您的触发器能够与基于集合的多行插入和更新一起正常工作。

    另一种设计方案是拥有一个主表,该表是所有具有不同详细信息的表的父表,并针对该表使用 FK。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 2014-01-24
      • 2014-03-23
      • 2014-12-30
      相关资源
      最近更新 更多