如何解决永不删除关系数据库架构设计
| 我正在考虑为从未真正删除任何内容(设置已删除标志或其他内容)的数据库设计一个关系数据库架构。 1)通常使用哪些元数据列来适应这种架构?显然,可以为IsDeleted设置布尔标志。也许只是“已删除”列中的时间戳效果更好,或者两者都有。我不确定从长远来看哪种方法会给我带来更多问题。 2)在此类架构中通常如何处理更新?如果将旧值标记为已删除并插入一个新值,则会遇到PK唯一约束问题(例如,如果您具有PK列ID,则新行必须具有与刚刚标记为无效的ID相同的ID,或者否则,其他表中该ID的所有外键都将变得无用)。解决方法
这是您还要考虑的一些其他问题
删除的频率。您的绩效预算如何?这会影响您的选择。根据用户是否删除单行,您设计的答案会有所不同(例如,让我们说一个在问答网站上的答案与每小时从提要中删除记录)
您将如何在系统中公开已删除的记录。是仅出于管理目的,还是任何用户都可以看到已删除的记录。这有所作为,因为您可能需要根据用户需要提出一种过滤机制。
外键约束如何工作。一个表可以引用另一条有已删除记录的表吗?
添加或更改现有表时,删除的记录会如何处理?
正如Steve Prentice所提到的,通常非常关心审计的系统使用表。它通常具有原始表中的每个字段,并且所有约束都已关闭。它通常会有一个操作字段来跟踪更新与删除,并包括更改的日期/时间戳以及用户。
有关示例,请参见http://data.stackexchange.com/stackoverflow/query/new上的PostHistory表
, 如果您的目标是审核,我将为您拥有的每个表创建一个影子表。添加一些在更新和删除时触发的触发器,并将该行的副本插入影子表。
, 我认为您在此处查找的内容通常称为“知识约会”。
在这种情况下,您的主键将是常规键加上知识的开始日期。
您的结束日期对于当前记录可能为空,也可能为“时间结束”。
在更新中,通常会将当前记录的结束日期设置为“现在”,然后插入一条新记录,并从新值开始在同一“现在”处。
在“删除”上,您只需将结束日期设置为“现在”即可。
,
我已经做到了。
2.a)版本号在某种程度上解决了唯一性约束问题,尽管那只是放松唯一性而已。
2.b)您也可以将旧版本归档到另一个表中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。