2013-06-11 64 views
7

最近我想到了将历史数据存储在MySQL数据库中的最佳实践。目前,每个可版本化表格有两列 - valid_fromvalid_to,均为DATETIME类型。有当前数据的记录有valid_from充满其创建日。当我更新这一行时,我用更新日期填写valid_to,并在前一行中添加valid_fromvalid_to相同的新记录 - 简单的东西。但是我知道表格非常快,所以读取数据可能非常缓慢。
我想知道您是否有任何存储历史数据的做法?MySQL数据库中历史数据的最佳实践

+2

做一些存档,即将历史数据移动到不同的表格,并保持当前表格最新。 –

+1

@PradeepPati如果他需要能够选择历史数据和当前数据的查询,这将极大地使应用程序复杂化。但是他可以提出一些观点来“合并”历史表和当前表。 – Kamil

+0

@Kamil它确实不会让任何事情复杂化,而是保持应用程序的理智。你需要历史,你去历史表,你需要当前的数据,去当前的表。 –

回答

7

这是一个常见的错误是担心“大”表和性能。如果您可以使用索引来访问您的数据,那么您是否拥有1000条1000000条记录并不重要 - 至少不能测量。你提到的设计是常用的;这是一个非常棒的设计,时间是业务逻辑的关键部分。

例如,如果您想知道客户下订单时价格是多少,可以搜索产品记录,其中valid_from < order_date和valid_until为null或> order_date为止最简单的解决方案。

这并非总是如此 - 如果你保持周围只是为了存档的目的,它可能更有意义创建归档表中的数据。但是,你必须确保时间真的不是业务逻辑的一部分,否则搜索多个表的痛苦就会显著 - 想象一下,你想了解每一次搜索,可在产品表或product_archive表关于订单点的产品价格。

0

这不是完整的答案,只是一些建议。

您可以添加索引的布尔场像is_valid。这应该可以提高具有历史和当前记录的大表的表现。

一般 - 存储seprate表的历史数据可你的应用程序变得复杂(试想一下,应该有混合当前和历史记录获得的数据...查询的复杂性)。

今天电脑真的很快。我认为你应该比较/测试性能与单个表和单独的表的历史记录。

除了 - 尝试测试你的硬件,看看是如何快速的MySQL大表以确定如何设计数据库。如果它对你来说太慢 - 你可以调整MySQL配置(从增加缓存/ RAM开始)。

0

我即将完成一个完全这样的应用程序。我的大部分索引都是先通过关键字段索引,然后是valid_to字段,对于当前记录,该字段设置为NULL,从而允许轻松且即时地找到当前记录。由于我的大多数应用程序都处理实时操作,因此索引提供了快速的性能。在一段时间后,需要有人看到历史记录,并在该实例有一个性能命中,但是从测试它,因为大多数的记录没有在其生命周期非常多的变化不是太糟糕了。

如果您可能有许多超过当前记录的各种密钥的过期记录,它可能会支付索引over 之前任何关键字段。