2014-09-20 22 views
0

我知道还有其他关于历史记录的文章,很多人都在谈论SQL中的审计功能和其他功能,以及是否使用单个表或辅助表或审计表。这最关于如何使用单表方法。单表历史数据的MS SQL设计

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

幸运的是,由于这个应用程序非常小,几乎没有任何性能问题,所以对开发人员来说很容易就很重要。

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

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

由于所有数据都基于客户端,一个建议是生成自定义ClientNum(我们将不得不反正),然后用这个关系到所有其它表,而不是加盟的ID。通过这种方法,只需要查询ClientNum上的表并获取最新的InsertDate标记即可。当然,它也可能导致每个表都必须具有自己的自定义Num字段,如客户端表中的ClientNum和ClientInfo表中的ClientInfoNum。

或者是否有记录是否有效的标志?

为了达到同样的目的,是否仅仅使用客户端的身份标识就可以获得更多的收益?

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

编辑

以下是ClientNum提议的示例。他们都显示客户名称已从ABC公司更改为ABCD公司。你怎么知道第一个例子中的这两个记录与对方有什么关系?

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,以便我可以确保所有历史记录都相互关联。

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

+0

你的描述是漫无目的,并没有多大意义,你有很多关于你的域的假设和知识,我们没有你的关于客户的评论以及对我们毫无意义的评论。 – 2014-09-20 23:54:56

+0

你的回答如下是我的想法,至少你可以理解我在想什么。我可以提供尽可能详细的信息,以帮助您。 – Zookie 2014-09-21 00:34:24

回答

0

这是一个非常简单的过程。您只需要一个名为“结束日期”或“非活动日期”或类似字段的字段。所有活动记录都有此字段为空。当您创建记录的新“版本”时,您将插入一个新的“版本”,并在上一条记录上设置“无效日期”。这同时会将其标记为“不活动”,并为您提供何时处于非活动状态的历史排序。

这意味着您只需要在InactiveDate = null的记录上查询以查找当前记录。

+0

这是有道理的,除了你如何知道一个版本的记录与另一个版本相关?我对原始问题进行了编辑,给出了一个简单添加InactiveDate与使用InactiveDate并生成我正在谈论的ClientNum的示例。看看这是否有道理,或者如果我错过了这样做的另一种方式。 – Zookie 2014-09-21 00:36:13

+0

@Zookie - 是的,你必须有一个把他们联系在一起的领域。这可能是您建议的字段,或者它可能是多对多的连接表,或者您可以生成一个与绑定记录ID无关的唯一编号。 – 2014-09-21 00:49:58