【问题标题】:better way to mark deleted entries in RDBMS在 RDBMS 中标记已删除条目的更好方法
【发布时间】:2014-02-17 09:58:38
【问题描述】:

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

【问题讨论】:

  • 在您的应用程序中访问电子邮件时检查状态是否=>1,然后认为它已删除
  • @xrcwrn 是的,我可以这样做,但为此我必须阅读。我想在不进行读取的情况下仅使用唯一约束来做到这一点。

标签: mysql postgresql database-design


【解决方案1】:

我建议使用时间戳列而不是数字来存储已删除状态,因为通常也需要时间信息。它被称为时间模型,通常使用两个时间戳来定义有效区间http://en.wikipedia.org/wiki/Temporal_database Anchor 模型用特殊概念扩展了这个模型:Anchor,Tier,Knot,Attribute http://en.wikipedia.org/wiki/Anchor_Modeling 实际上,所有的时间模型在常规 RDBMS 实现中都有很多问题,这个问题在 SQL 2012 中得到了解决,但同时它并没有得到广泛的实现,并且 RDBMS 供应商提供了非常不同的解决方案,即变更数据捕获或闪回。

【讨论】:

猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 2018-11-25
  • 2016-07-22
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多