9

最近我想到了将历史数据存储在 MySQL 数据库中的最佳实践。目前,每个可版本化的表都有两列 -valid_fromvalid_to,两种DATETIME类型。具有当前数据的记录已valid_from填满其创建日期。当我更新这一行时,我填写valid_to更新日期并添加与前一行valid_from相同的新记录valid_to- 简单的东西。但我知道该表会非常快,因此获取数据可能会非常慢。
我想知道您是否有存储历史数据的做法?

4

3 回答 3

10

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

例如,如果您想知道客户下订单时某件商品的价格,那么能够搜索其中 valid_from < order_date 和 valid_until 为 null 或 > order_date 的产品记录是迄今为止最简单的解决方案。

情况并非总是如此——如果您只是为了存档目的而保留数据,那么创建存档表可能更有意义。但是,您必须确保时间确实不是业务逻辑的一部分,否则搜索多个表的痛苦将是巨大的——想象一下,每次您想了解下订单时产品的价格。

于 2013-06-11T20:20:57.940 回答
0

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

您可以添加索引布尔字段,如is_valid. 这应该可以提高具有历史和当前记录的大表的性能。

一般来说 - 将历史数据存储在单独的表中可能会使您的应用程序复杂化(想象一下应该获取具有混合当前和历史记录的数据的查询的复杂性......)。

今天的计算机真的很快。我认为您应该将历史记录与单表和单独表进行比较/测试性能。

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

于 2013-06-11T20:27:07.920 回答
0

我即将完成一个完全可以做到这一点的应用程序。我的大多数索引首先按关键字段索引,然后valid_to是为当前记录设置的字段,NULL从而可以轻松快速地找到当前记录。由于我的大多数应用程序都处理实时操作,因此索引提供了快速的性能。有时有人需要查看历史记录,在这种情况下,性能会受到影响,但从测试来看,它并不算太糟糕,因为大多数记录在其生命周期内没有太多变化。

如果您可能拥有比当前记录更多的各种键的过期记录,则可能需要在任何键字段之前对 valid_to 进行索引。

于 2013-06-11T20:54:04.180 回答