MySQL计算字段的良好实践

时间:2012-12-19 10:37:12

标签: mysql

我有两张如下表:

ERD

我只想知道使用这种结构是否是一个好习惯,并将所有发票金额的总和放在父表上,以便获得更快的请求并避免一些重复计算(结果将更新为发票表后的触发器?)

或者更好的是获得一个规范化的表并且不缓存那种计算字段?

2 个答案:

答案 0 :(得分:1)

我认为使用给定结构存储总计没有任何问题。您有invoice_numberinvoice_date作为密钥使用,因此不存在混淆的危险。只计算一次显然更有效。基本上,为什么每次需要结果时进行计算?

答案 1 :(得分:1)

本身这是不错的做法。 但是,在实现之前,您应该三思而后行。非规范化可以提高性能,但并非总是如此,并且在可维护性方面也有成本。

平均而言,每个项目存在多少子项目发票?如果只有少数,那么计算总数的成本可以忽略不计。在这种情况下不要反规范化。

对于一个给定项目,子项目发票清单可能会多久更改一次?如果很少,那么你应该预先计算总数。

相反,如果子项目发票列表可能会“经常”更改(与您需要读取/计算总和的频率相比),那么您可能会花更多时间重新计算不必要的金额。

底线:在确定真实瓶颈之前不要进行非规范化。一旦确定真正的性能问题,重写应用程序以便稍后进行重构应该相对轻松。