如何设计单个备份表进行软删除? [关闭]
Posted
技术标签:
【中文标题】如何设计单个备份表进行软删除? [关闭]【英文标题】:How to design a single backup table for soft-deletion? [closed] 【发布时间】:2015-09-15 19:40:18 【问题描述】:我研究了在软删除和硬删除数据库中的行之间选择什么。我阅读了以下链接中给出的所有建议:
What is the best way to implement soft deletion? Physical vs. logical / soft delete of database record? Are soft deletes a good idea? http://blog.sqlauthority.com/2010/09/03/sql-server-soft-delete-isdelete-column-your-opinion/并得出结论 如果旧数据将来由于审计、恢复等原因变得重要,软删除是删除数据并同时保留数据的唯一方法。并且可以更有效地实施如果将表行移动到包含相同类型列和一些额外信息(如Who deleted the row?
或When was row deleted?
)的备份表。
我不知道我的产品的未来会怎样,我的客户现在不要求但将来可能会要求旧数据。但是要实现软删除的备份表方法,我必须为我的数据库中的每个表创建克隆表。但是将来会有很多桌子和更多桌子。或者,如果我更改了一张表的设计(例如更改数据类型或添加列),我也必须更改其备份表的设计。
那么,我的问题是,有什么方法可以创建一个包含其他已删除表的行的表? (比如RecycleBin
表或类似的东西)。
我也对其他可以通过性能实现这一目标的方法持开放态度。
我使用的是 SQL Server 2008 和 2012。
更新
好的,我通过结合你们建议的所有内容来建议这个解决方案:
-
原表从
A
重命名为A_Main
审核表是A_Audit
,其中存储了删除元数据。示例:谁删除、何时删除等,ID 外键来自A_Main
。
使用旧的原始表名称A
创建一个视图,以避免修改所有查询和存储过程。此视图将仅选择 A_Main
中的那些行,其中 A_Audit
不包含它们的 ID
。
现在将在此视图上完成操作。
这是个好方法吗?
【问题讨论】:
使用 laravel,它有免费的内置软删除 实际上我正在将 .NET 与 SQL Server 一起使用。而且我不懂php编程。我认为 Laravel 是一个 PHP 框架。 我认为您只能在表中创建像DELETED
这样的逻辑字段,并从只返回非 DELETED
registers 的表中创建视图。我不知道 SQL Server 有没有,但是像 Oracle 这样的数据库有一些特性,比如分区表和物化视图,可以优化寄存器访问。
不幸的是,这是题外话,因为任何回应都将基于意见。这里没有正确或错误的答案。就我个人而言,我鄙视软删除,因为查询错误的机会太多,突然你会看到“已删除”的数据。我希望有一个单独的表来存储“已删除”数据,这样它就不会影响当前数据。归根结底,您必须做出决定并使其在您的系统中运行。听起来你知道每个版本的陷阱。选择一个然后去做。
@JeanJung 但是为此我需要在每个存储过程和查询中用它们的视图替换表的所有引用。但它会有效吗?我的意思是仍然表有数据。
【参考方案1】:
将此问题视为学术问题:
所以,我的问题是有什么方法可以创建一个表 可以包含被删除的其他表的行? (像一个 RecycleBin 表或类似的东西)。
仅当您要归档的所有表都具有相同的列结构时。否则,您需要为要实施此软删除方法的每个表创建一个备份表。然后,您可以在表上放置一个触发器以在从原始表中删除一行时填充备份表,或者通过填充备份表并从原始表中删除的存储过程来控制删除。
【讨论】:
请看我的更新。我尝试了一种更简单的方法。但不知道它是否有效。 抱歉,编辑(“这是一个好方法吗?”)只会让您的问题更加基于观点和离题。如果它有效,那很好。如果它不起作用,请告诉我们原因,也许我们可以帮助您调试它。 我同意 Tab Alleman 的上述回答。审计表(基于触发器或“并行更新”)是捕获“主”表中所做更改的有用方法,我熟悉的商业数据库应用程序(4Series)使用了这种技术。如果主表有更新审计表的触发器,这将成为一个简单而优雅的解决方案。可以说这个问题不再“太宽泛”,因为使用触发器和审计表的答案可以用几段来表达。以上是关于如何设计单个备份表进行软删除? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Windows Vista Complete PC 备份中提取文件? [关闭]