我正在考虑为从不实际删除任何内容的数据库设计关系数据库模式(设置已删除的标志或其他内容)。
1)通常使用哪些元数据列来容纳这样的架构?显然,可以设置IsDeleted的布尔标志。或者也许只是删除列中的时间戳更好,或者两者兼而有之。从长远来看,我不确定哪种方法会给我带来更多问题。
2)如何在这种架构中处理更新?如果将旧值标记为已删除并插入新值,则会遇到PK唯一约束问题(例如,如果您有PK列ID,则新行必须与您刚标记为无效的ID具有相同的ID,或者否则,该ID的其他表中的所有外键都将变得无用。)
答案 0 :(得分:3)
如果您的目标是审核,我会为您拥有的每个表创建一个影子表。添加一些在更新和删除时触发的触发器,并将该行的副本插入影子表。
答案 1 :(得分:0)
我认为你在这里寻找的东西通常被称为“知识约会”。
在这种情况下,您的主键将是您的常规键加上知识开始日期。
对于当前记录或“结束时间”标记,您的结束日期可能为空。
在更新时,您通常会将当前记录的结束日期设置为“now”,并使用新值在“now”处插入新记录。
在“删除”中,您只需将结束日期设置为“现在”。
答案 2 :(得分:0)
2.a)版本号解决了一些独特的约束问题,尽管它实际上只是放松了它的独特性。
2.b)您也可以将旧版本存档到另一个表格中。
答案 3 :(得分:0)
以下是您还需要考虑的其他一些问题
删除的频率。你的绩效预算是什么样的?这可能会影响您的选择。设计的答案会有所不同,具体取决于用户是否删除了一行(例如,让我们在Q& A网站上说答案,而不是每小时从Feed中删除记录)
您打算如何在系统中公开已删除的记录。是仅通过管理目的还是任何用户都可以看到已删除的记录。这有所不同,因为您可能需要根据用户提出过滤机制。
外键约束如何工作。一个表是否可以引用另一个已删除记录的表?
当您添加或更改现有表时,已删除的记录会发生什么?
正如史蒂夫·普伦蒂斯所提到的那样,关心审计的系统通常使用表格。它通常包含原始表中的所有字段,并关闭所有约束。它通常会有一个操作字段来跟踪更新与删除,并包含更改的日期/时间戳以及用户。
有关示例,请参阅http://data.stackexchange.com/stackoverflow/query/new
上的PostHistory表