是存储计算值还是根据要求重新计算它们更好?

eie*_*fai 9 performance database-design

可能的重复:
存储与计算聚合值

在一个旧的工作中,我们有这个数据库,它不是规范化的,一些不再使用的表,它是一个又一个补丁。总而言之,这是一团糟。

有一次,当我试图修复它时,我看到一些字段是动态计算的,这使得数据库执行简单的选择查询非常慢。从那以后,我不再计算任何字段,我只是按原样存储数据。

这是推荐吗?什么时候存储数据比计算数据更好?

谢谢你们。

Dav*_*ett 11

这取决于。

存储派生值可以加快后续读取请求的处理速度,因为不需要再次计算这些值。

但是,以这种方式对数据进行非规范化存在一个关键问题:您必须确保派生值不可能过时而未被检测到。如果您的数据不是足够正常的形式,则不一致可能会蔓延并导致麻烦。这意味着更新值所源自的数据的任何地方也必须刷新派生值或以某种方式将其标记为需要在依赖之前更新。通过触发器更新派生值可能会减少在代码中的许多地方添加此逻辑的情况,但请注意触发器有自己的一组潜在问题(意外的锁定问题,业务逻辑层中的代码不期望它不期望的值) t 显式引用更新,可以禁用触发器,等等)。