我正在Asp.net Mvc中开发卡片管理应用程序。我们使用Fluent Nhibernate作为ORM和Sql Server 2008。
当用户选择删除数据时,我们正在考虑不删除数据。
我的问题是,这样做的最佳方法是什么,以及它的后果是什么(性能,Db大小)?
我们数据库的一些重要表格可能有数千条记录。
提前致谢。
答案 0 :(得分:2)
我从没想过这是一个好主意,特别是涉及到外键时。这确实可以使事情变得比他们需要的更复杂。我从来不喜欢删除但未真正删除的记录的想法。这很麻烦,IMO。
如果你想保留已删除的行,我建议将它们放在某种存档或历史表中。这样你就可以将它们放在那里用于将来的分析,如果你需要的话,可以在必要时将它们带回来。
数据库的大小确实不是问题。 “成千上万”的记录对SQL Server来说毫无意义。在我们的制造数据库中,我们的一些表中有数亿行。表现非常出色。
使用SQL Server 2008,您可以使用Change Data Capture,可以非常好地为您处理已删除的行。
答案 1 :(得分:2)
我现在工作的位置以及以前的位置,这个想法一直围绕记录上的DeletedDate
和DeletedBy
。这样,无论何时检索信息,您都可以过滤掉并仅获取DeletedDate == null
的记录。
这种方式还为您提供了一种跟踪删除数据的方式以及何时删除,同时还可以通过将DeletedDate
重置为null来“还原”删除。
在性能和数据库大小方面,我不会太担心它,因为SQL Server能够处理数百万行数据。
如果性能绝对至关重要并且您注意到应用程序变慢,则可以轻松地将已删除的数据存档到单独的备份数据库中。
如果您不想长时间保存数据,可以定期删除数据库中一年多前DeletedDate
的所有内容。
答案 2 :(得分:0)
我会在删除触发器之后创建(它也有一些性能损失)并在归档表中插入已删除的行。然后可以对存档表进行分区/数据压缩(如果使用SQL Server的enterprice版本)。
归档表看起来就像基表,除了有一些额外的ID列,我还会删除删除数据的删除日期和用户名。