001*_*001 136 sql database database-design data-modeling soft-delete
软删除是个好主意还是坏主意?
您只需将其标记为IsDeleted = true
,而不是实际删除数据库中的记录,并且在恢复记录后,您可以将其标记为False
.
这是一个好主意吗?
最好是物理删除记录,然后将其移动到存档数据库,如果用户想要记录回来,那么软件会在存档中查找记录并重新创建它吗?
Mus*_*sis 100
我说这是一个坏主意,通常(也许有一些例外).
首先,应该定期备份您的数据库,因此您永远不会因为DELETE而永久丢失数据(当然,除非是删除刚添加的数据).
其次,像这样的软删除意味着你现在必须WHERE IsDeleted = false
在这个表的每个查询中包含一个子句(如果你正在加入这些表,那就更糟了).一旦用户或测试人员发现删除的记录再次出现,就会发现这里的错误,这可能需要一些时间.此外,开发人员很容易从COUNT(*)查询中省略WHERE子句,这可能需要更长的时间才能发现(我曾在一个已经发生多年的项目上工作过;没有多少记录被"删除" ,所以总数接近预期,没有人注意到).
最后,软删除将在具有人工键的表上工作,但可能无法在具有自然主键的表上工作(例如,您从社会安全号码键入的表中"删除"某人 - 当您执行时,您会怎么做需要添加他吗?请不要说"在复合主键中包含IsDeleted".).
在设计评审中,我希望开发人员能够展示成本和收益的意识,并以这种方式提供进行软删除的绝佳理由."为什么不这样做?" 不是一个很好的理由.
Rob*_*vey 93
避免潜在的数据丢失绝不是一个坏主意.
我总是软删除.在需要擦除一个或多个记录的数据库的情况下,我通常采用两步软删除过程,然后清空记录的"回收站",或文档管理式方法,其中文档记录可以老去,然后在硬删除之前通过批准程序.
dev*_*xer 32
这取决于具体情况.我可以看到法律要求您真正删除某些内容的情况.也许有人要求将您的社会安全号码从您的系统中永久删除.或者您可能有一个重复记录要合并到一个记录中.使用已删除的标志保留副本可能不是有利的.
还有一个技术缺点:您无法执行级联删除操作,这会自动清除对已删除数据的任何引用以防止外键冲突.这不一定是一个大问题,但要记住这一点.
否则,我认为这是个好主意.
Jos*_*ton 24
如果您要使用软删除,最好使用deleted_date字段,而不是is_deleted字段.你得到一个很好的额外数据而不仅仅是位字段.
xan*_*ndy 20
软删除的主要问题之一是那些不需要的数据可能会影响db性能.几年前,我的一个客户端要求我对所有数据库项进行软删除,我的解决方案是将所有"已删除"项目移动到备份表,而不是将其留给当前运行的表.
我不会试图"在政治上正确".如果你提倡软删除,那么你需要进行大脑检查.
1)首先,通过不删除表中的行,您究竟达到了什么目的?事实上,将来某个时候你可以访问这些行,对吧?那么为什么不创建一个存档表并在那里移动行?这有什么问题?
2)使用软删除,您将在is_active上创建不必要的查询或在某个时间戳列上创建查询.当你编写更简单的查询时,这只是浪费.是的,它可以用于视图,但是视图不是额外的附属物吗?每个视图都是一个额外的SQL,额外的性能成本,在任何商业RDBMS中都只是一个表.除了你不知道如何在表格之上编写查询这一事实之外,没有任何神奇的观点.
3)是的,它可以使用View或MV.但后来我看到生产中的查询做FTS,一切仍然有效!现代硬件和固体软件的奇迹.但那也不是正确的.因此,通过相同的逻辑,仅仅因为它起作用并不意味着它是正确的
4)软删除的复杂性永远不会停留在一个简单的选择.
A)假设您有一个UNIQUE约束.现在您软删除一行,但具有UNIQUE约束的列仍然存在.当你想要重新添加相同的数据时,如果没有额外的"技巧",你就无法做到这一点.
B)您可能有从表A到表B的关联,当您从表A中软删除某些内容时,您需要确保表B上的独立查询处理该事实.假设一个典型的详细信息页面正在处理一些detail_id.
现在,master_id被软删除,但你仍然可以在任何地方使用master_id的detail_id永久链接.在master_id上进行硬删除时,这些细节根本不存在.现在使用软删除它们仍然存在,并且它们必须知道它们的master_id处于软删除模式的事实.
它不会停留在简单的Table_A.is_active = 0或1阶段.
5)做简单而正确的删除操作.
A)没有人必须在任何地方添加任何额外的东西或担心任何事情.
只需存档数据+相关部分,你应该很好.
有时软删除是必要的.例如,假设您有一个引用Products表的Invoice表.一旦您创建了具有特定产品的发票,您就可以永远不会删除该产品(如果您的RI设置正确,它将不会让您).
此特定方案假定您永远不想删除发票,在真实公司中您可能不希望删除历史财务数据.
虽然还有许多其他情况下您无法删除某些数据作为依赖关系的副作用,但由于业务或其他原因导致链条无法删除.
归档时间: |
|
查看次数: |
75425 次 |
最近记录: |