最近我考虑了在MySQL数据库中存储历史数据的最佳实践。目前,每个可版本表都有两列-valid_from
和valid_to
,都是datetime
类型。具有当前数据的记录的valid_from
填充了其创建日期。当我更新此行时,我将valid_to
填充更新日期,并使用valid_from
添加新记录,与前一行中的valid_to
相同-简单的操作。但是我知道这个表会非常大,非常快,所以获取数据会非常慢。
我想知道您是否有存储历史数据的实践?
担心“大”表和性能是一个常见的错误。如果您可以使用索引来访问数据,那么如果您有1000000个记录中的1000个,这并不重要--至少不是因为您能够测量。你提到的设计是常用的;这是一个伟大的设计,其中时间是业务逻辑的关键部分。
例如,如果您想知道客户机下订单时一个项目的价格是多少,那么能够搜索valid_from
这种情况并不总是如此--如果您只是为了归档而保留数据,那么创建归档表可能更有意义。但是,您必须确保时间确实不是业务逻辑的一部分,否则搜索多个表的痛苦将是巨大的--想象一下,每次您想要了解产品在下订单时的价格时,都必须搜索product表或product_archive表。