3

这是 heximal 在我的其他帖子中提出的评论的后续。我想有一deleted_on列来检测已删除的记录,十六进制表示该列是多余的。

这是他的评论:

您要使用deleted_xx字段来确定记录是否已删除?

恕我直言,最好和最好的方法是添加以记录布尔数据类型的一些活动属性(例如名为的字段ACTIVE)。因此,为了“删除”记录,我们必须在单个 UPDATE 查询中更新ACTIVE字段 和update_date的值。updated_by为了选择所有活动记录,我们只需要进行如下查询:

SELECT * FROM MyTable WHERE ACTIVE=1

我知道 Oracle Applications 使用这种方法,我同意

我还阅读了以下帖子:

我的问题是:如何在具有上面十六进制建议的isActive标志的表上设置唯一约束。我的所有表中都有代理键。但我想确保自然键列(我们称之为业务键列)具有唯一约束。

如果我有一个deleted_on字段来跟踪删除,那么我可以将此列作为自然键约束的一部分。因此,它允许具有相同业务组合键的多个已删除记录,仅在 deleted_on 日期字段中有所不同。

如果我有isActive字段并使用last_updated_on列来跟踪删除日期,我必须在自然键约束上有 2 个选项

  1. 我可以将isActive其作为我的自然键约束的一部分。但这将允许最多只删除一条具有相同业务组合键的已删除记录。
  2. 我可以将isActivepluslast_updated_on作为自然键约束的一部分。但我看到有一个额外的列 deleted_on 使它更容易。

有什么想法吗?我在这里错过了什么吗?

4

3 回答 3

1

“我的问题是如何在具有 isActive 标志的表上设置唯一约束,如上面的十六进制建议。我的所有表中都有代理键。但我想确保自然键列(我们称之为业务键列) 有一个唯一的约束。

如果我有一个 deleted_on 字段来跟踪删除,那么我可以将此列作为自然键约束的一部分。因此,它允许具有相同业务组合键的多个已删除记录,仅在 deleted_on 日期字段中有所不同。”

即使将 deleted_on DATE 字段作为自然键的一部分,您仍然无法在同一天全部删除-重新插入-删除。可能看起来很病态,但你真的能确定病态病例永远不会发生吗?

如果您的数据库需要反映某些内容是“活跃的”这一事实,即它与当前业务高度相关,而其他一些内容是“不活跃的”,例如,保留它的唯一原因time 用于存档目的,然后通过定义两个表来设计数据库以反映该事实:一个具有“活动”内容,另一个具有“存档”内容。每当删除发生时,也许您可​​以使用触发器自动实现“移动到存档”。

这样做,您可以让 DBMS 使用“活动”表上的唯一约束强制执行自然键,并且可以在“归档”表中包含删除时间戳,甚至可能不需要在都在那张桌子上。

于 2011-04-19T11:51:41.247 回答
0

添加“VERSION”(整数)而不是 ACTIVE 列怎么样?

  • 当前(活动,未删除)版本为 0
  • 每当您将当前版本替换为新版本时,您都会更新所有现有行,将 VERSION 替换为 VERSION-1(因此当前版本变为 -1,以前的当前版本变为 -2 等等)然后使用 VERSION=0 插入新的当前记录.

当然,这个版本字段很容易成为自然键的一部分。

于 2011-04-19T08:49:20.927 回答
0

我正要写一篇大论文时,我想起我已经写在了
使用 EAV 表的“软删除”解决方案有问题吗?
如果您想要的是撤消删除的简单方法,或保留删除的跟踪记录以进行审计/故障排除,则使用镜像表是一种简单的解决方案。

软删除最佳实践 (PHP/MySQL)
您需要考虑“删除”的真正含义。您似乎希望能够重建历史,在这种情况下,“删除”一词会引起混淆。这真的不是删除。您想改用某种时间数据模型并引入有效日期的概念。

或者,如果您只关心数据量,删除或移动早于 X 天/年的行的简单批处理也是一种非常简单的方法。

于 2011-04-19T19:08:19.480 回答