3

这是对我的其他帖子之一发表的评论的后续行动。我想要有一个deleted_on列来检测已删除的记录,其中十六进制表示此列是多余的。如何在事务数据库中存储已删除的行

这里是他的评论:

你要使用deleted_xx字段,以确定该记录被删除?

imho,最好也是最好的方法是添加记录布尔数据类型的某些活动属性(例如名为ACTIVE的字段)。因此,为了“删除”记录,我们必须在单个UPDATE查询中更新ACTIVE字段和update_date,updated_by的值。为了选择所有活动的记录,我们就必须做出这样的查询:

SELECT * FROM MyTable的WHERE ACTIVE = 1

我知道,甲骨文的应用程序使用此方法,我同意

我也可以参考以下文章:

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

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

如果我有isActive字段并使用last_updated_on列跟踪删除日期,我必须对自然键约束

  1. 2个选择,我可以包括isActive我的自然键约束的一部分。但是,这将允许最多只有一个具有相同商业密钥组合的已删除记录。
  2. 我可以包括isActivelast_updated_on自然键约束的一部分。但是我看到有一个额外的列deleted_on使它更容易。

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

回答

1

“我的问题是如何设置唯一约束的表上有一个isActive标志,如上面的十六进制所示,我在所有表中都有代理键,但我想确保自然键列调用业务密钥列)有一个唯一的约束

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

即使有DELETED_ON DATE域为您的自然键的一部分,你仍然无法删除,重新插入,删除所有在同一天。看起来可能是病态的,但你真的可以确定这种病态永远不会发生吗?

如果您的数据库需要反映一个事实,即有些内容是“活跃”在某种意义上说,它是对当前的业务高度相关,和其他一些内容是“不活动”,例如从某种意义上说,保留一段时间的唯一原因是为了存档目的,然后通过定义两个表来设计数据库以反映这一事实:一个包含“活动”内容,另一个包含“存档”内容。也许您可以使用触发器在发生删除时自动实现“移至归档”。这样做,您可以让DBMS在“活动”表上使用唯一约束来强制执行自然键,并且可以在“存档”表中包含删除时间戳,而且您甚至可能不需要定义该表上的任何键。

+0

谢谢你的想法。 Deleted_on将有一个时间戳 - 因此,可以处理病态的情况:)。为每个表格执行2个表格会带来更多问题 - 如果删除和归档仍然被另一个表格引用会怎样? – 2011-04-19 14:25:54

+0

然后无论如何,你都有一个SQL无法处理的RI问题。如果SQL的功能如此强大,那么你可以定义一个视图,它是'active'和'archive'的联合,并且让你的FK引用视图。唉,在我认识的任何SQL产品中都不行。但是,嘿,如果您更改了布尔标志或在主表中设置了delete_date,那么您将如何处理这些引用行?您是否仍然会加入涉及连接的查询中的那些伪删除的行,或者即使引用行本身仍然处于活动状态,您是否会主动跳过这些行?都不正确。 – 2011-04-19 16:24:01

0

增加一个“版本”(整数),而不是一个ACTIVE列是什么?

  • 当前(激活,不删除)版本0
  • 无论何时您更换一个新的当前版本更新所有版本-1(所以目前版本为-1,取代以前版本的现有行当前版本变为-2等等),然后用VERSION = 0插入新的当前记录。

此版本字段可以很容易地自然键的一部分,当然。

+0

这将导致大量的更新,每次有一个新的删除,我不希望这样,除非有巨大的好处。在自然需要版本控制的情况下,这是有道理的。但在这里,我没有看到一个理由。 – 2011-04-19 09:39:05

0

我要写一个大作文时,我才想起,我已经写在
Are there problems with this 'Soft Delete' solution using EAV tables?
如果你想要的是撤消删除或保持删除的记录审计/故障的简单方法目的,使用镜像表是一个简单的解决方案。

and Soft delete best practices (PHP/MySQL)
您需要考虑“删除”的真正含义。您似乎希望能够重建历史,在这种情况下,“删除”一词会造成混淆。这真的不是删除。您想要使用某种时态数据模型,并引入生效日期的概念。

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

相关问题