建议的方法来保存非常大的表的审计历史信息

时间:2017-04-06 07:01:46

标签: database database-design spring-data spring-data-jpa

对于我们使用Spring,Java 8和SQL Server 2012进行绿化的新项目,我们可能会有一个非常大的(在宽的,大约150列的意义上)表来存储合同信息。该项目的目标是保留一些有关合同信息的审计信息。此历史信息也应该在应用程序本身中提供,因此可以查看旧版本的合同。

如果这是一张较小的桌子(并且将桌子缩小成小块就可以考虑了)我只是在合同的表格中创建一个新条目,或者可能有一个单独的历史表格信息。

但是,在磁盘使用方面,这似乎并不是最佳选择。尽管我们拥有的合同数量相对较少(<100k),但未来的历史数量肯定会增长,具体取决于人们的工作方式。

我知道另一种选择可能是简单地将事物存储在关键/价值方法中以保持不同的增量,但在某种情况下,以某种方式重建合同似乎是一种痛苦,只是为了显示历史信息。

我错过了任何好的选择吗?

2 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server 2016,则可以考虑使用Temporal Table.这样您就可以在任何时间点查询数据。

答案 1 :(得分:0)

SQL Server Temporal表是一种原始设计,它会隐藏很多系统工作,可能会出现无法解决的性能问题。所有这一切,它只呈现数据的单时间访问(事务时间)。对类似问题的回答是here,其中讨论了版本范式。在这个特定的答案中,我还提出了一个交易时间设计,但是有一些链接可以进一步详细说明设计,这些链接会进行一些细微的修改,以实现完整的双时间访问(有效/有效时间以及交易时间)

简而言之,有效时间是数据生效的时间,而不是数据写入数据库的时间。例如,截至1月1日,价格从14美元变为32美元。但是,数据库直到1月7日才更新。如果您使用交易时间访问数据,截止日期为1月3日,你会得到14美元的旧价格。如果您在该日期执行了查询,那么这就是数据库报告的内容。但是,如果您使用有效时间进行访问,那么您将获得32美元,因为这是当时生效的价格,即使数据库直到之后才意识到这一点。这两种访问都有要求。

我的方法的一大优势(完全双时间访问除外)是您确定合同实体的哪些字段为“版本”(跟踪所有更改)。此外,由于您可以控制设计的所有方面,因此可以更好地处理与性能相关的问题。更不用说你不需要学习一种新形式的SQL。

好的,还有更多优点:

  • 当前和历史数据位于相同的表中。您无需事先确定数据是当前数据还是历史数据来确定数据源。
  • 实际上,相同的查询用于检索当前数据,交易时间数据或有效时间数据。
  • 通过避免Row Spanning Dependencies,表现令人印象深刻。