如何在事务数据库中存储已删除的行

| 这是heximal在我的其他帖子中提出的评论的后续内容。我想要一个“ 0”列来检测已删除的记录,十六进制表示该列是多余的。 这是他的评论: 您将使用
deleted_xx
字段确定记录已删除吗? 恕我直言,最好和最好的方法是添加以记录一些布尔数据类型的活动属性(例如,名为“2ѭ”的字段)。因此,为了“删除”记录,我们必须在单个UPDATE查询中更新
ACTIVE
字段和
update_date
updated_by
的值。为了选择所有活动记录,我们只需要进行如下查询: SELECT * FROM MyTable WHERE ACTIVE = 1 我知道Oracle应用产品使用这种方法,并且我同意 我还阅读了以下帖子: 将已删除的行存储在表中 http://www.udidahan.com/2009/09/01/dont-delete-just-dont/ http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx 我的问题是:如何在具有isActive标志的表上设置唯一约束,如上面的十六进制所示。我的所有表格中都有代理键。但是我想确保自然键列(我们称为业务键列)具有唯一约束。 如果我有一个“ 0”字段来跟踪删除,则可以将此列作为自然键约束的一部分。因此,它允许多个具有相同业务密钥组合的已删除记录,仅在delete_on日期字段中有所不同。 如果我有
isActive
字段并使用
last_updated_on
列跟踪删除日期,那么我必须对自然键约束使用2个选项 我可以将“ 7”作为我的自然键约束的一部分。但是,这样最多只能允许一个删除的记录具有相同的业务密钥组合。 我可以将
isActive
last_updated_on
作为自然键约束的一部分。但我看到有多余的一列deleted_on使其更容易。 有什么想法吗?我在这里想念什么吗?
已邀请:
\“我的问题是如何在具有isActive标志的表上设置唯一约束,如上面的十六进制所示。我的所有表中都有代理键。但是我想确保自然键列(我们称之为业务键)列)具有唯一约束。 如果我有一个delete_on字段来跟踪删除,则可以将此列作为自然键约束的一部分。因此,它允许多个具有相同业务键组合的已删除记录,仅在delete_on日期字段中有所不同。\“ 即使将Deleted_on DATE字段作为自然键的一部分,您仍无法在同一天全部删除,重新插入,删除。看起来可能是病理性的,但是您真的可以确定这种病理性情况永远不会发生吗? 如果您的数据库需要反映某些内容在某种意义上与当前业务高度相关的“有效”,而另一些内容则是“无效”的事实,例如从某种意义上说,保留时间的唯一原因是出于存档目的,然后通过定义两个表来设计该数据库以反映该事实:一个表具有“ active”内容,另一个表具有“ archived”内容。也许您可以使用触发器在发生删除时自动实现“移至归档”。 这样做,您可以使DBMS使用\“ active \”表上的唯一约束来强制您的自然键,并且可以在\“ archive \”表中包含一个删除时间戳,甚至可能不需要定义该表上的所有键。
添加\“ VERSION \”(整数)而不是ACTIVE列怎么办? 当前(有效,未删除)的版本为0 每当您用新版本替换当前版本时,您都要更新所有现有行以VERSION-1替换VERSION(这样,当前版本将变为-1,以前的当前版本将变为-2,依此类推),然后使用VERSION = 0插入新的当前记录。 当然,“版本”字段可以轻松地成为自然键的一部分。
当我想起我已经写过一篇大论文时,我正准备写一篇大论文 使用EAV表的“软删除”解决方案是否存在问题? 如果您想要的是撤消删除的简单方法,或者为了审计/疑难解答而保留删除的跟踪记录,则使用镜像表是一个简单的解决方案。 和 软删除最佳做法(PHP / MySQL) 您需要考虑“删除”的真正含义。似乎您希望能够重建历史记录,在这种情况下,术语“删除”会引起混乱。确实不是删除。您想使用某种时态数据模型,并引入有效日期的概念。 或者,如果您只关心数据量,那么简单的批处理过程就是删除或移动X天/年以上的行也是一种非常简单的方法。

要回复问题请先登录注册