这是 heximal 在我的其他帖子中提出的评论的后续。我想有一deleted_on
列来检测已删除的记录,十六进制表示该列是多余的。
这是他的评论:
您要使用
deleted_xx
字段来确定记录是否已删除?恕我直言,最好和最好的方法是添加以记录布尔数据类型的一些活动属性(例如名为的字段
ACTIVE
)。因此,为了“删除”记录,我们必须在单个 UPDATE 查询中更新ACTIVE
字段 和update_date
的值。updated_by
为了选择所有活动记录,我们只需要进行如下查询:SELECT * FROM MyTable WHERE ACTIVE=1
我知道 Oracle Applications 使用这种方法,我同意
我还阅读了以下帖子:
- 将已删除的行存储在表中
- http://www.udidahan.com/2009/09/01/dont-delete-just-dont/
- http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx
我的问题是:如何在具有上面十六进制建议的isActive标志的表上设置唯一约束。我的所有表中都有代理键。但我想确保自然键列(我们称之为业务键列)具有唯一约束。
如果我有一个deleted_on
字段来跟踪删除,那么我可以将此列作为自然键约束的一部分。因此,它允许具有相同业务组合键的多个已删除记录,仅在 deleted_on 日期字段中有所不同。
如果我有isActive
字段并使用last_updated_on
列来跟踪删除日期,我必须在自然键约束上有 2 个选项
- 我可以将
isActive
其作为我的自然键约束的一部分。但这将允许最多只删除一条具有相同业务组合键的已删除记录。 - 我可以将
isActive
pluslast_updated_on
作为自然键约束的一部分。但我看到有一个额外的列 deleted_on 使它更容易。
有什么想法吗?我在这里错过了什么吗?