永不删除关系数据库架构设计

Dav*_*iov 6 mysql sql-server oracle postgresql relational-database

我正在考虑为数据库设计一个从不实际删除任何内容的关系数据库模式(设置已删除的标志或其他内容).

1)通常使用哪些元数据列来容纳这样的架构?显然,可以设置IsDeleted的布尔标志.或者也许只是删除列中的时间戳更好,或者两者兼而有之.从长远来看,我不确定哪种方法会给我带来更多问题.

2)如何在这种架构中处理更新?如果将旧值标记为已删除并插入新值,则会遇到PK唯一约束问题(例如,如果您有PK列ID,则新行必须与您刚标记为无效的ID具有相同的ID,或者否则,该id的其他表中的所有外键都将变得无用).

Con*_*rix 0

以下是您还需要考虑的一些其他问题

  1. 删除发生的频率。您的绩效预算是怎样的?这会影响您的选择。您的设计的答案将会有所不同,具体取决于用户是否删除单行(例如问答网站上的答案与从提要中每小时删除记录)

  2. 您将如何公开系统中已删除的记录。是仅出于管理目的还是任何用户都可以查看已删除的记录。这会产生影响,因为您可能需要根据用户提出过滤机制。

  3. 外键约束将如何工作。一个表可以引用另一张已删除记录的表吗?

  4. 当您添加或更改现有表时,已删除的记录会发生什么情况?

通常,像 Steve Prentice 提到的那样,非常关心审计的系统使用表。它通常具有原始表中的每个字段,并且所有约束都被关闭。它通常会有一个操作字段来跟踪更新与删除,并包含更改的日期/时间戳以及用户。

有关示例,请参阅https://data.stackexchange.com/stackoverflow/query/new上的 PostHistory 表