我应该将计算值与变量一起存储在我的数据库中吗?

时间:2011-12-16 03:55:12

标签: database

在我使用数据库的所有应用程序中,我通常将计算出的值与计算该值所需的变量一起存储。例如,如果我有tonnagecost,我会将它们相乘以计算total。我可以在每次需要时重新计算值,我只是想知道是否有标准方法。无论哪种方式都适合我,我只想做最常见的事情。

如果我存储计算变量,它会使我的域类更复杂,但会使我的控制器逻辑更清晰,如果我不存储计算的变量,那么反过来。

计算不会非常频繁,但可能适度频繁,但数学便宜吗?

5 个答案:

答案 0 :(得分:8)

标准方法不是存储这种计算值 - 它会破坏规范化。

在某些情况下,您希望存储计算值,如果重新计算时间过长,或者您正在运行数据仓库等等。在您的情况下,您希望遵守规范化规则。

答案 1 :(得分:3)

这违反了普通表格以获得此计算值。除非有理由进行非规范化(通常是性能约束),否则你应该尽一切努力规范化表格,它会使你的数据库更容易维护/改进,而非规范化可能会把你锁定在一个难以改变的设计中并暴露出来您的数据存在不一致和冗余。

答案 2 :(得分:1)

根据我的经验,最常见的事情是a)存储计算值,b)数据库中没有任何CHECK约束,以保证值是正确的。

正确的要做的事情是

  • 不存储计算结果
  • 将计算值存储在使用CHECK约束验证的列中。

MySQL不支持CHECK约束。所以你的选项是

  • 不存储计算结果
  • 切换到支持CHECK约束的dbms,例如PostgreSQL。

答案 3 :(得分:1)

这完全取决于您的环境中缺少哪些资源。如果您预先计算了该值,则会节省CPU时间,但会增加网络使用量和数据库存储空间。现在,CPU时间通常比网络带宽和数据库存储更加丰富,所以我猜想只要计算不太复杂,那么预先计算该值是不值得的。

另一方面,您计算的值可能需要大量的CPU。在这种情况下,您可能希望将该值缓存在DB中。

所以,这取决于你拥有什么和缺少什么。

答案 4 :(得分:0)

简单的数学运算相对便宜,但是在存储这些值时,您需要权衡额外的存储成本与性能节省。您可能想要考虑的另一件事是这将对数据更新产生影响,您只能更新字段值,您还需要更新计算值。