将计算数据保存到数据库而不是计算输入是不好的做法? (导轨)

时间:2016-04-26 03:06:01

标签: ruby-on-rails database

将计算数据保存到数据库记录中是不好的做法,而不仅仅是计算输入?

示例:

如果我们将语言测试的结果保存为db记录,并且测试有3个部分需要保存在单独的列中:listening_scorespeaking_score,{{1} }

是否可以使用名为writing_score的第四列,等于 overall_score

或者每次( listening_score + speaking_score + writing_score ) / 3想要查看历史结果时都应重新计算overall_score

我的想法是,这会导致数据库中数据的不必要重复。但它会使提取数据变得更简单。

这是否有一般规则?

2 个答案:

答案 0 :(得分:2)

存储计算的总数可以被认为是缓存。像这样的缓存计算意味着你必须开始处理保持计算最新,并担心什么时候不是。从长远来看,这种模式可以带来很多工作。另一方面,始终计算总数意味着您将始终使用新的计算。

我已经看到人们存储计算来解决性能问题,因为计算需要很长时间,因为它的复杂性或基于它的查询的复杂性。这是开始考虑像这样缓存结果的一个很好的理由。

我也看到人们存储这个值以使查询更容易。这是一个较低的投资回报率,但如果计算中使用的列不经常变化,那么仍然值得。

我的默认值是计算,我希望看到将计算值存储在另一列中的正当理由。

(值得注意的是,如果在特定函数调用中多次使用相同的计算,则可以记住结果以提高性能而不将结果存储在数据库中。)

答案 1 :(得分:2)

这不错,但并不好。这里没有最佳实践,因为每种情况的答案都不同。存在用于持久计算属性而不是根据需要计算它们的权衡。决定是否需要或持续计算的重要因素是:

  1. 计算的复杂性
  2. 依赖字段更改的频率
  3. 要用作搜索条件的计算字段
  4. 计算数据量
  5. 计算字段的使用(例如:一次操作/查看一条记录与大数据样式报告)
  6. 计算期间对其他流程的影响
  7. 将查看计算字段的频率。
  8. 关于这个问题有很多意见。每种情况都不同。您必须确定持久保存属性和维护其值的开销是否值得付出额外的努力,而不仅仅是根据需要进行计算。

    使用上述因素,我对持久计算属性的偏好会增加为

    • 计算的复杂性上升
    • 依赖字段的更改频率下降
    • 用于搜索条件的计算字段上升
    • 计算字段用于复杂报告
    • 查看计算字段的频率会上升。

    我从第二个列表中省略的因素取决于外部因素,并且更具可变性。