【发布时间】:2014-11-15 06:08:25
【问题描述】:
我知道还有其他关于历史记录保存的帖子,并且很多人谈论审计功能和 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,以便我可以确保所有历史记录都相互关联。
这是我不知道我是否正确接近或者是否有更好的方法来完全做到这一点的部分。
【问题讨论】:
-
你的描述是游荡的,没有多大意义,你有很多关于你的领域的假设和知识,我们没有,所以你的 cmets 关于客户和什么并不意味着什么我们。
-
您的回答与我的想法一致,因此至少您可以理解我的想法。我可以提供尽可能多的细节来帮助你。
标签: sql database-design