2009-01-15 63 views
11

我想确定我应该如何存储历史交易数据。如何最好地处理历史数据的存储?

我应该将它存储在一张表中,每次记录只是重新插入一个新的时间戳吗?

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

如果是这样,我该如何做到最好?使用自动将数据复制到历史记录表的触发器?或者与我的应用程序中的逻辑?每Welbog的评论

更新:

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

主要搜索和报告操作将在历史数据中运行。

性能是一个问题。搜索不应该整夜运行以产生结果。

+0

这实际上取决于您所谈论的数据量。什么样的交易?哪些操作最常用于历史数据?性能有多重要? – Welbog 2009-01-15 17:51:14

回答

8

如果要求仅用于报告,请考虑构建一个单独的数据仓库。这使您可以使用像缓慢变化的维度这样的数据结构,这些维度对历史报告来说更好,但在事务性系统中效果不佳。由此产生的组合也将您的生产数据库中的历史报告移出,这将是一次性能和维护的胜利。

如果您需要在应用程序中使用此历史记录,那么您应该实施某种版本控制或逻辑删除功能,或者使所有内容完全相反并重新进行(即事务不会被删除,只是被撤销并重新进行)。仔细想想你是否真的需要这会增加很多复杂性。制作一个可以正确重建历史状态的交易应用程序比看起来要困难得多。金融软件(例如保险承保系统)未能做到这一点比您想象的要多得多。

如果您只需要审计日志记录的历史记录,请创建影子表和审计日志记录触发器。这比试图在应用程序中正确全面地实现审计日志记录要简单得多并且更加健壮。触发器也将从应用程序外部的来源获取对数据库的更改。

2

这个问题沿着业务逻辑线。首先了解您的业务需求,然后从那里开始。对于这种情况,数据仓库是一个很好的解决方案。 ETL将为您提供许多处理数据流的选项。你的'历史'和'主动'这个基本概念是非常正确的。如果将数据保存在数据仓库及其所有维度和事实数据表中,则您的历史数据将更加高效和灵活。