在DB表中标记已删除的记录

时间:2010-05-30 10:50:02

标签: language-agnostic database-design database-schema

有时您想将数据库表记录标记为已删除而不是永久删除它,对吧?

你是怎么做到的?

到目前为止,我一直在使用布尔“删除”字段,但我不确定它是否是一个很好的评价。

5 个答案:

答案 0 :(得分:6)

就是这样 - 一个布尔字段表示记录被删除。我用过的几次,我称之为IsDeleted

这通常被称为逻辑删除

您可以在报告中尊重该字段 - 这意味着使用IsDeleted = true排除所有记录。如果你有很多表和关系,那些查询会变得有点复杂。

此外,如果您对表有唯一约束,则可能会遇到一些问题。例如,如果在用户表中,用户有IsDeleted = true且电子邮件列是唯一的,则无法添加具有相同电子邮件地址的新用户。

有一些ORM会考虑这些字段 - 例如,如果存在名为“已删除”或“IsDeleted”的列,则SubSonic 2.2不会删除记录,而是将此字段设置为true。

一些相关资源:

作为替代方案,您可以添加审核表。

答案 1 :(得分:2)

我通常使用IsDeleted。

如果有多个状态(例如正常,存档,删除),我可能会使用Enum(或Int,如果不可用)来表示状态。通常我会在这种情况下将字段命名为Status或State。

答案 2 :(得分:1)

我认为这是一个好的解决方案。另一种方法是将数据移动到另一个表,某种历史表,因此在包含活动数据的表中搜索数据会更快。但这取决于你的情况。

答案 3 :(得分:1)

在银行业中,存储所有修改(不仅仅是删除)被认为是一种很好的做法。通常它是在“日志表”中完成的,DDL与原始DDL几乎相同,加上一些标志来指示操作类型,日期和时间。时间,用户等。但是(非常重要)日志表是在没有唯一键的情况下定义的!

答案 4 :(得分:1)

我会使用datetime,null或alive,时间戳为“删除”。

非常适合

if(timestamp) {}

因为它默认为null。