【发布时间】:2011-02-25 15:59:55
【问题描述】:
有时您希望将数据库表记录标记为已删除,而不是永久删除,对吧?
你是怎么做到的?
到目前为止,我一直在使用布尔“已删除”字段,但我不确定它是否是一个好的方法。
【问题讨论】:
标签: language-agnostic database-design database-schema
有时您希望将数据库表记录标记为已删除,而不是永久删除,对吧?
你是怎么做到的?
到目前为止,我一直在使用布尔“已删除”字段,但我不确定它是否是一个好的方法。
【问题讨论】:
标签: language-agnostic database-design database-schema
我认为这是一个不错的解决方案。另一种方法是将数据移动到另一个表,某种历史表,因此在包含活动数据的表中搜索数据会更快。但这取决于你的情况。
【讨论】:
我通常使用 IsDeleted。
如果有多个状态(例如正常、存档、已删除),我可能会使用 Enum(或 Int,如果不可用)来表示状态。在这种情况下,我通常将字段命名为 Status 或 State。
【讨论】:
就是这样 - 一个布尔字段,表示记录已被删除。有几次我使用它时,我称该字段为IsDeleted。
这通常称为逻辑删除。
您可以在报告中尊重该字段 - 这意味着排除所有带有IsDeleted = true 的记录。如果您有很多表和关系,这些查询可能会变得有点复杂。
此外,如果您对表有唯一约束,您可能会遇到一些问题。例如,如果在用户表中用户有IsDeleted = true 并且电子邮件列是唯一的,我将无法添加具有相同电子邮件地址的新用户。
有些 ORM 会考虑这些字段 - 例如,如果存在名为“Deleted”或“IsDeleted”的列,SubSonic 2.2 不会删除记录,而是将此字段设置为 true。
一些相关资源:
作为替代方案,您可以添加审核表。
【讨论】:
在银行业,存储所有修改(不仅仅是删除)被认为是一种很好的做法。通常它是在“日志表”中完成的,其 DDL 与原始的一个加几个标志几乎相同,以指示操作类型、日期和时间、用户等。但是(非常重要)日志表是在没有唯一键的情况下定义的!
【讨论】:
我会使用 datetime,null 表示存活,timstamp 表示“deleted on”。
非常适合
if(timestamp) {}
因为它默认为空。
【讨论】: