一尘不染

如何最好地处理历史数据的存储?

sql

我正在尝试确定如何存储历史交易数据。

我是否应该将其存储在单个表中,在该表中每次都会用新的时间戳重新插入记录?

我是否应该将历史数据分解为单独的“历史”表,而仅将当前数据保留在“活动”表中。

如果是这样,我该怎么做?使用自动将数据复制到历史记录表的触发器吗?还是在我的应用程序中包含逻辑?

根据Welbog的评论更新:

将有大量的历史数据(数十万行-最终可能为数百万行)

主要是对历史数据进行搜索和报告操作。

性能是一个问题。搜索不必整夜运行才能产生结果。


阅读 147

收藏
2021-03-17

共1个答案

一尘不染

如果要求仅用于报告,请考虑建立一个单独的数据仓库。这样一来,您就可以使用缓慢变化的维度之类的数据结构,这些数据结构更适合历史报表,但在事务系统中效果不佳。最终的组合还将历史报告从您的生产数据库中移出,这将是性能和维护上的胜利。

如果您需要此历史记录在应用程序中可用,则应实施某种版本控制或逻辑删除功能,或使所有内容完全相反并重新声明(即,事务永远不会被删除,只会被撤消并重新声明)。请仔细考虑您是否
真的
需要这样做,因为这样做会增加很多复杂性。制作一个可以正确重建历史状态的事务应用程序比看起来要难得多。金融软件(例如,保险承保系统)无法做到这一点,超出了您的想象。

如果您仅需要历史记录来进行审计日志记录,请创建影子表和审计日志记录触发器。这比尝试在应用程序中正确,全面地实施审核日志记录要简单得多,而且功能更强大。触发器还将从应用程序外部的源获取对数据库的更改。

2021-03-17