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

时间:2011-06-21 21:32:17

标签: mysql sql-server oracle postgresql relational-database

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

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

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

4 个答案:

答案 0 :(得分:3)

如果您的目标是审核,我会为您拥有的每个表创建一个影子表。添加一些在更新和删除时触发的触发器,并将该行的副本插入影子表。

答案 1 :(得分:0)

我认为你在这里寻找的东西通常被称为“知识约会”。

在这种情况下,您的主键将是您的常规键加上知识开始日期。

对于当前记录或“结束时间”标记,您的结束日期可能为空。

在更新时,您通常会将当前记录的结束日期设置为“now”,并使用新值在“now”处插入新记录。

在“删除”中,您只需将结束日期设置为“现在”。

答案 2 :(得分:0)

  1. 我做到了。
  2. 2.a)版本号解决了一些独特的约束问题,尽管它实际上只是放松了它的独特性。

    2.b)您也可以将旧版本存档到另一个表格中。

答案 3 :(得分:0)

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

  1. 删除的频率。你的绩效预算是什么样的?这可能会影响您的选择。设计的答案会有所不同,具体取决于用户是否删除了一行(例如,让我们在Q& A网站上说答案,而不是每小时从Feed中删除记录)

  2. 您打算如何在系统中公开已删除的记录。是仅通过管理目的还是任何用户都可以看到已删除的记录。这有所不同,因为您可能需要根据用户提出过滤机制。

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

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

  5. 正如史蒂夫·普伦蒂斯所提到的那样,关心审计的系统通常使用表格。它通常包含原始表中的所有字段,并关闭所有约束。它通常会有一个操作字段来跟踪更新与删除,并包含更改的日期/时间戳以及用户。

    有关示例,请参阅http://data.stackexchange.com/stackoverflow/query/new

    上的PostHistory表