我有一个与数据库设计相关的问题。我正在使用的数据库需要以某种方式处理数据,使其永远不会被物理删除。我们开始向一些表添加"DeleteDateTime“列,即默认情况下为NULL,但一旦标记,就会将记录标记为已删除。
这让我们能够轻松地将数据归档,但我仍然对一些领域一无所知,特别是这是否符合最佳实践,以及如何有效地对这些表进行索引。
我给您举个例子:我们有一个名为“Course”的表,它有一个由"SiteID“和"CourseID”列组成的复合主键。该表还有一个名为"DeleteDateTime“的列,它是根据我上面的描述使用的。
我无法使用SQL Server 2008筛选视图功能,因为我们必须与SQL Server 2005兼容。我应该在这个表的聚集索引中包含"DeleteDateTime“吗?如果是,它是否应该是索引中的第一列(即"DeleteDateTime,SiteID,CourseID")...
有没有人有任何理由让我应该或不应该遵循这种方法?
谢谢!
发布于 2009-11-24 00:36:31
有没有可能将这些“死”记录转移到一个单独的表中?例如,对于您的Courses表,有一个Courses_deleted表或类似的东西,具有相同的结构。
当您“删除”一条记录时,您基本上只是将其移动到“死表”中。这样,你实际的当前数据的索引就会保持小而灵活……
如果您需要有一个聚合视图,您可以随时定义一个将两个表合并在一起的Courses_View。
您的实际表上的聚集索引应该尽可能小、静态、恒定并且尽可能小,所以我绝对不建议在其中放入这样一个日期时间列。这不是个好主意。
有关如何选择一个好的集群密钥以及需要做些什么的优秀信息,请查看Kimberly Tripp的博客条目:
Marc
发布于 2009-11-24 00:40:36
您对数据保留的要求是什么?您是否查看了审核日志,而不是将所有非最新数据保留在数据库中?
我认为对于包括"DeleteDateTime“列在内的复合索引来说,这是非常正确的。
发布于 2009-11-24 02:49:48
我会创建一个视图,基本上是
select {List all columns except the delete flag}
from mytable
where deletflag is null这就是我在表上的所有查询中使用的内容。原因是为了防止人们忘记考虑deleted标志。SQL Server2005可以很容易地处理这种视图,如果您要将此设计用于删除记录,则有必要使用此设计。我将在delted列上有一个单独的索引。我可能不会让它成为聚集索引的一部分。
https://stackoverflow.com/questions/1784296
复制相似问题