2

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

4

6 回答 6

8

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

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

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

于 2009-02-24T13:22:25.883 回答
2

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

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

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

于 2009-02-24T13:21:40.660 回答
1

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

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

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

于 2009-02-24T13:27:34.513 回答
0

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

我已经看到在非常大的数据库上放弃了约束——如果你比较性能并且存在显着的外键开销,那将是不使用它们的一个原因。

于 2009-02-24T13:24:06.613 回答
0

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

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

于 2009-02-24T13:24:14.850 回答
0

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

于 2009-02-24T13:39:11.787 回答