Language agnostic 在数据库表中标记已删除的记录

Language agnostic 在数据库表中标记已删除的记录,language-agnostic,database-design,database-schema,Language Agnostic,Database Design,Database Schema,有时您希望将DB表记录标记为已删除,而不是永久删除它,对吗 你是怎么做到的 到目前为止,我一直在使用布尔“deleted”字段,但我不确定这是否是一个好方法。我认为这是一个好的解决方案。另一种方法是将数据移动到另一个表,某种历史记录表,这样在包含活动数据的表中搜索数据会更快。但这取决于你的情况。我通常使用IsDeleted 如果有多个状态(如正常、存档、删除),我可能会使用枚举(或Int,如果不可用)来表示状态。在这种情况下,我通常会将字段命名为Status或State。仅此而已-一个布尔字段,

有时您希望将DB表记录标记为已删除,而不是永久删除它,对吗

你是怎么做到的


到目前为止,我一直在使用布尔“deleted”字段,但我不确定这是否是一个好方法。

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

我通常使用IsDeleted


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

仅此而已-一个布尔字段,用于指示记录已被删除。我使用它的几次,我将该字段称为
IsDeleted

这通常称为逻辑删除

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

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

有些ORM会将这些字段考虑在内-例如,如果存在名为“Deleted”或“IsDeleted”的列,亚音速2.2不会删除记录,而是会将此字段设置为true

一些相关资源:


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

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

我会使用datetime,null表示活动,timstamp表示“已删除”

它非常适合你

if(timestamp) {}
因为它默认为null