如何确定数据库表关系是否值得强制执行参照完整性?

时间:2009-02-24 13:16:54

标签: database cascade referential-integrity

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

6 个答案:

答案 0 :(得分:8)

鉴于这个选项,我总是保留数据。由于您已经拥有外键,因此您可以获得一些内置的完整性违规保护。

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

至于实现,根据你的db,添加等同于你的表的布尔/位逻辑。默认情况下,所有行都被赋值为true / 1; “删除”标记为false / 0。

答案 1 :(得分:2)

您可以使用外键和关系来强制引用完整性,而无需使用级联删除。我很少使用级联删除,因为我总是发现通常更好地拥有数据并管理/存档它比删除它

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

逻辑删除工作也很出色,我广泛使用它们。

答案 2 :(得分:1)

你不想删除一些数据 - 你可能最终会得到流氓数据,你根本不知道它属于哪里。无论是全有还是全无。

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

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

答案 3 :(得分:0)

我会说使用外键约束作为规则 - 这会长期“保护”您的数据库设计,以及数据完整性本身。约束也是明确说明设计者的决定。

我已经看到在极大数据库上抛弃了约束 - 这是不使用它们的一个原因,如果你比较性能并且有很大的外键开销。

答案 4 :(得分:0)

我使用逻辑/软删除。这基本上意味着将另外一列(可能是位列Deleted)添加到相关表中,这会将特定行标记为已删除。

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

答案 5 :(得分:0)

永远不要进行物理删除。您可以添加BOOL标志IsDeleted以指示记录已删除。如果要“删除”记录,只需将标志设置为True。