【问题标题】:MS SQL Design for Single Table Historical Data单表历史数据的 MS SQL 设计
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 这是有道理的,除了你怎么知道记录的一个版本与另一个版本相关联?我对原始问题进行了编辑,以举例说明仅添加 InactiveDate 与具有 InactiveDate 以及生成我正在谈论的 ClientNum 的示例。看看这是否有意义,或者我是否错过了另一种方法。
  • @Zookie - 是的,你必须有一个字段将它们联系在一起。这可以是您建议的字段,也可以是多对多的连接表,或者您可以只生成一个不会更改且与记录 ID 无关的唯一编号。
猜你喜欢
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多