这是对我的其他帖子之一发表的评论的后续行动。我想要有一个deleted_on
列来检测已删除的记录,其中十六进制表示此列是多余的。如何在事务数据库中存储已删除的行
这里是他的评论:
你要使用
deleted_xx
字段,以确定该记录被删除?imho,最好也是最好的方法是添加记录布尔数据类型的某些活动属性(例如名为
ACTIVE
的字段)。因此,为了“删除”记录,我们必须在单个UPDATE查询中更新ACTIVE
字段和update_date
,updated_by
的值。为了选择所有活动的记录,我们就必须做出这样的查询:SELECT * FROM MyTable的WHERE ACTIVE = 1
我知道,甲骨文的应用程序使用此方法,我同意
我也可以参考以下文章:
- Store deleted rows in a table
- http://www.udidahan.com/2009/09/01/dont-delete-just-dont/
- http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx
我的问题是:如何设置唯一约束具有isActive标志由heximal上述建议的表格。我的所有表格中都有代理键。但我想确保自然键列(我们称之为业务键列)具有唯一的约束。
如果我有一个deleted_on
现场跟踪其删除,那么我可以加入此列的自然键约束的一部分。因此,它允许多个具有相同业务键组合的已删除记录,仅在deleted_on日期字段中有所不同。
如果我有isActive
字段并使用last_updated_on
列跟踪删除日期,我必须对自然键约束
- 2个选择,我可以包括
isActive
我的自然键约束的一部分。但是,这将允许最多只有一个具有相同商业密钥组合的已删除记录。 - 我可以包括
isActive
加last_updated_on
自然键约束的一部分。但是我看到有一个额外的列deleted_on使它更容易。
有什么想法?我在这里错过了什么吗?
谢谢你的想法。 Deleted_on将有一个时间戳 - 因此,可以处理病态的情况:)。为每个表格执行2个表格会带来更多问题 - 如果删除和归档仍然被另一个表格引用会怎样? – 2011-04-19 14:25:54
然后无论如何,你都有一个SQL无法处理的RI问题。如果SQL的功能如此强大,那么你可以定义一个视图,它是'active'和'archive'的联合,并且让你的FK引用视图。唉,在我认识的任何SQL产品中都不行。但是,嘿,如果您更改了布尔标志或在主表中设置了delete_date,那么您将如何处理这些引用行?您是否仍然会加入涉及连接的查询中的那些伪删除的行,或者即使引用行本身仍然处于活动状态,您是否会主动跳过这些行?都不正确。 – 2011-04-19 16:24:01