2

我有两个如下表:

ERD

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

还是获取规范化表而不缓存计算字段的类型更好?

4

2 回答 2

1

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

于 2012-12-19T10:47:43.387 回答
1

这本身并不是坏习惯。但是,在实施之前您应该三思而后行。非规范化可能会提高性能,但并非总是如此,而且在可维护性方面也有成本。

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

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

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

底线:在确定现实中的瓶颈之前不要进行非规范化。一旦确定了真正的性能问题,以后重写应用程序以解决重构问题应该相对容易。

于 2012-12-19T10:56:38.340 回答