【问题标题】:How do you determine if a database table relationship merits enforcing referential integrity?您如何确定数据库表关系是否值得强制引用完整性?
【发布时间】:2009-02-24 21:39:11
【问题描述】:

我有一个应用程序,其中大多数数据库表与另一个表有很强的关系。目前我正在使用外键强制执行参照完整性,但我想知道这是否真的是最好的方法。业务用户可以从管理界面中删除主表中的数据,这意味着必须执行级联删除(或编写多个删除语句),但我不确定我是否真的要删除所有其他数据同时。可能有很多数据*可能*在以后有用(可能报告?)。但是,除非与主表存在关系,否则从表中的数据对应用程序本身来说基本上是无用的。

【问题讨论】:

    标签: database cascade referential-integrity


    【解决方案1】:

    如果可以选择,我总是保留数据。而且由于您已经有了外键,因此您可以通过一些内置的保护来防止完整性违规。

    如果您的用户想要“删除”一条记录,从而将其从应用程序中隐藏,请考虑“虚拟删除”策略 - 将记录标记为非活动,而不是从数据库中物理删除它。

    至于实现,根据您的数据库,为您的表添加任何等同于布尔/位逻辑的内容。默认情况下,所有行都分配为 true/1; “删除”被标记为 false/0。

    【讨论】:

      【解决方案2】:

      您可以使用外键和关系来强制引用完整性,而不必使用级联删除。我很少使用级联删除,因为我一直发现拥有数据并对其进行管理/归档通常比删除它更好

      只需编写您自己的删除逻辑来支持您自己的业务规则。

      逻辑删除也很有效,我广泛使用它们。

      【讨论】:

        【解决方案3】:

        您不想删除某些数据 - 您最终可能会得到流氓数据,因为您一开始就不知道它属于哪里。要么全有,要么全无。

        软删除,即在每一行上都有一个位字段来确定记录是否被“删除”是要走的路。这样,您只需检查 API 中的记录是否已删除 == true,然后将其从应用程序中隐藏。

        您保留数据,但没有人可以通过应用程序检索它。

        【讨论】:

          【解决方案4】:

          我会说通常使用外键约束 - 这可以长期“保护”您的数据库设计以及数据完整性本身。约束也用于明确说明设计师的决定。

          我已经看到在超大型数据库上放弃了限制 - 如果您比较性能并且存在大量外键开销,那将是不使用它们的原因之一。

          【讨论】:

            【解决方案5】:

            我会使用逻辑/软删除。这基本上意味着在有问题的表中再添加一列(可能是位列Deleted),这会将特定行标记为已删除。

            也就是说,“已删除”的数据就是:已删除。因此,它不能在逻辑上用于报告和类似的东西。为了克服这个问题,我还引入了Hidden 列来隐藏某些保留其逻辑含义的行。

            【讨论】:

              【解决方案6】:

              永远不要进行物理删除。您可以添加一个 BOOL 标志 IsDeleted 来指示记录已被删除。当您想“删除”记录时,只需将标志设置为 True。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-18
                • 1970-01-01
                • 2012-09-27
                • 2015-03-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多