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

如何解决永不删除关系数据库架构设计

| 我正在考虑为从未真正删除任何内容(设置已删除标志或其他内容)的数据库设计一个关系数据库架构。 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?