单表历史数据的MS SQL设计

时间:2014-09-20 23:49:32

标签: sql database-design

我知道还有其他关于历史记录保存的帖子,很多人都在谈论SQL中的审核功能和其他功能,以及是使用单个表还是使用辅助表或审计表。这主要是关于如何使用单表方法。

构建具有历史数据但不允许删除的客户端文档应用程序。记录不会有那么多修改,但随着时间的推移,将有多达一万条活动记录和历史记录的一小部分记录。

幸运的是,由于这个应用程序非常小,几乎任何方法都不应该有很多性能问题,因此开发人员的轻松很重要。

我们已经决定将所有内容保存在单个表中可能是此应用程序的最佳方法。也就是说,无论如何它是每张桌子的单人桌子。例如,我们有一个名为Client的表和一个名为ClientInfo的表,因此每个表将保存其各自表的历史数据。希望这是有道理的。

我们现在需要做的是确定跟踪哪条记录发生变化以及哪条记录是活动的还是历史记录的方式,而不会使SQL语句在整个应用程序中成为一个纯粹的噩梦。

由于所有数据都基于客户端,因此一个提议是生成自定义ClientNum(我们将会拥有它),然后将其用于与所有其他表的关系,而不是加入ID。使用这种方法,只需查询ClientNum上的表并获取最新的InsertDate标记即可。当然,它也可能导致每个表必须拥有自己的自定义Num字段,如Client表中的ClientNum和ClientInfo表中的ClientInfoNum。

或者在记录是否有效时标记是否更好?

为了同样的目的,仅仅使用Client的身份ID会获得更多收益吗?

是否有更合适的方法来使用单表历史数据存储系统?

修改

以下是ClientNum提案的示例。他们都显示ClientName已从ABC Company更改为ABCD Company。你怎么能告诉第一个例子中的这两个记录彼此有什么关系呢?

ID    ClientName      InactiveDate
----------------------------------
1   | ABC Company   |  09202014
2   | ABCD Company  |  NULL

现在在示例中,因为我们已经生成了一个ClientNum,并且它在原始记录和新记录上是相同的,所以很容易看出它们都是针对同一个客户端而且一个是当前数据,一个是老。

ID    ClientNum    ClientName     InactiveDate
----------------------------------------------
1   | 8761348    | ABC Company   |  09202014
2   | 8761348    | ABCD Company  |  NULL

但是我必须有一个ClientNum类型的列,尽管它会在每个需要历史数据的表中被命名为与表名相关,而这些列都是历史数据。对于ClientInfo表,需要生成ClientInfoNum,以便确保所有历史记录彼此关联。

这是我不知道的部分,如果我正确接近或者是否有更好的方法来完成这项工作。

1 个答案:

答案 0 :(得分:0)

这是一个非常简单的过程。你只有一个名为"结束日期"或"非活动日期"或类似的。所有活动记录都将此字段设为null。当您创建一个新的"版本"在记录中,您插入一个新记录,并在上一个记录上设置非活动日期。这同时标志着"不活跃"并为您提供何时处于非活动状态的历史顺序。

这意味着您只需查询InactiveDate = null的记录即可查找当前记录。