在RDBMS中标记已删除条目的更好方法

时间:2014-02-17 09:58:39

标签: mysql postgresql database-design

即使用户从前端删除某个实体,我也必须在我的RDBMS中保留实体的记录。假设我有一个用户表,其中每个用户都有一个唯一的电子邮件。现在说名为name1的用户有一封电子邮件email1。现在,该用户记录已从前端删除,有人试图创建一个name2用户并发送电子邮件email1的用户。这会违反email列上的唯一约束,但我仍然必须在该表中保留该记录,因此我的表中有一个名为status的列,其默认值为1。现在我对emailstatus有一个独特的约束。每当有人删除用户时,我都会将状态增加1.但是如果删除了带有电子邮件email1的用户记录两次,则会出现问题。在这种情况下,我将拥有状态为2的2个用户记录。 所以这种方法失败了。另一种方法是将删除的记录移动到不具有任何排序约束的不同表中。但是使用这种方法我需要为每个表都有一个额外的表,我需要跟踪已删除的条目。所以我觉得这很愚蠢。还有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我建议使用timestamp列而不是number来存储已删除的状态,因为通常也需要时间信息。它被称为时间模型,通常它使用两个时间戳来定义有效性区间http://en.wikipedia.org/wiki/Temporal_database锚模型使用特殊概念扩展此模型:锚点,层,结,属性http://en.wikipedia.org/wiki/Anchor_Modeling 实际上,所有时态模型在常规RDBMS实现中都存在许多问题,这个问题在SQL 2012中得到解决,但它并没有被广泛实现,而且RDBMS供应商提供了非常不同的解决方案a.k.a. Change Data Capture或Flashback。