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