最近我想到了将历史数据存储在MySQL数据库中的最佳实践。目前,每个可版本化表格有两列 - valid_from
和valid_to
,均为DATETIME
类型。有当前数据的记录有valid_from
充满其创建日。当我更新这一行时,我用更新日期填写valid_to
,并在前一行中添加valid_from
与valid_to
相同的新记录 - 简单的东西。但是我知道表格非常快,所以读取数据可能非常缓慢。
我想知道您是否有任何存储历史数据的做法?MySQL数据库中历史数据的最佳实践
回答
这是一个常见的错误是担心“大”表和性能。如果您可以使用索引来访问您的数据,那么您是否拥有1000条1000000条记录并不重要 - 至少不能测量。你提到的设计是常用的;这是一个非常棒的设计,时间是业务逻辑的关键部分。
例如,如果您想知道客户下订单时价格是多少,可以搜索产品记录,其中valid_from < order_date和valid_until为null或> order_date为止最简单的解决方案。
这并非总是如此 - 如果你保持周围只是为了存档的目的,它可能更有意义创建归档表中的数据。但是,你必须确保时间真的不是业务逻辑的一部分,否则搜索多个表的痛苦就会显著 - 想象一下,你想了解每一次搜索,可在产品表或product_archive表关于订单点的产品价格。
这不是完整的答案,只是一些建议。
您可以添加索引的布尔场像is_valid
。这应该可以提高具有历史和当前记录的大表的表现。
一般 - 存储seprate表的历史数据可你的应用程序变得复杂(试想一下,应该有混合当前和历史记录获得的数据...查询的复杂性)。
今天电脑真的很快。我认为你应该比较/测试性能与单个表和单独的表的历史记录。
除了 - 尝试测试你的硬件,看看是如何快速的MySQL大表以确定如何设计数据库。如果它对你来说太慢 - 你可以调整MySQL配置(从增加缓存/ RAM开始)。
我即将完成一个完全这样的应用程序。我的大部分索引都是先通过关键字段索引,然后是valid_to
字段,对于当前记录,该字段设置为NULL
,从而允许轻松且即时地找到当前记录。由于我的大多数应用程序都处理实时操作,因此索引提供了快速的性能。在一段时间后,需要有人看到历史记录,并在该实例有一个性能命中,但是从测试它,因为大多数的记录没有在其生命周期非常多的变化不是太糟糕了。
如果您可能有许多超过当前记录的各种密钥的过期记录,它可能会支付索引over 之前任何关键字段。
- 1. 数据库最佳实践
- 2. 数据历史记录跟踪最佳实践
- 3. MongoDB历史数据存储 - 最佳实践?
- 4. 最佳实践/ MariaDB的数据库
- 5. 类和数据库的最佳实践
- 6. 版本数据库的最佳实践
- 7. 最佳实践从数据库
- 8. Sqlite数据库连接最佳实践
- 9. 数据库部署最佳实践
- 10. 最佳实践数据库设计
- 11. 最佳实践:数据库引用表
- 12. Yii2数据库架构最佳实践
- 13. 使用数据库最佳实践?
- 14. Android数据库最佳实践
- 15. 数据库ID最佳实践
- 16. 数据库连接最佳实践
- 17. 数据库最佳实践 - 状态
- 18. Android数据库连接最佳实践
- 19. 数据库同步 - 最佳实践
- 20. 用户表数据库最佳实践
- 21. 数据库设计最佳实践
- 22. 最佳实践在数据库表
- 23. 数据库曝光:最佳实践
- 24. 数据库备份最佳实践
- 25. Android数据库最佳实践?
- 26. 最佳实践SCRIPT安装数据库
- 27. 最佳实践/数据源
- 28. 数据层最佳实践
- 29. Android数据最佳实践
- 30. 在MySQL中设计数据库的最佳实践
做一些存档,即将历史数据移动到不同的表格,并保持当前表格最新。 –
@PradeepPati如果他需要能够选择历史数据和当前数据的查询,这将极大地使应用程序复杂化。但是他可以提出一些观点来“合并”历史表和当前表。 – Kamil
@Kamil它确实不会让任何事情复杂化,而是保持应用程序的理智。你需要历史,你去历史表,你需要当前的数据,去当前的表。 –