在数据库中保留小计字段是一个坏主意

Dan*_*n C 6 mysql database-design denormalization

我有一个MySQL表,代表一个订单列表和一个相关的子表,代表与每个订单关联的货件(一些订单有多个货件,但大多数只有一个).

每批货物都有许多费用,例如:

  • ItemCost
  • 运输费
  • HandlingCost
  • TaxCost

应用程序中有许多地方需要获取订单的综合信息,例如:

  • TotalItemCost
  • TotalShippingCost
  • TotalHandlingCost
  • TotalTaxCost
  • 总成本
  • 总支付
  • TotalProfit

所有这些字段都取决于相关货件表中的汇总值.此信息用于其他查询,报告,屏幕等,其中一些必须快速为用户返回数万条记录的结果.

在我看来,有几个基本的方法可以解决这个问题:

  1. 使用子查询可在需要时从货件表中计算这些项目.对于需要全部或部分此类信息的所有查询,这会使事情变得复杂.它也很慢.

  2. 创建一个将子查询公开为简单字段的视图.这使得需要它们的报告变得简单.

  3. 在订单表中添加这些字段.这些将为我提供我正在寻找的性能,代价是在我对货件记录进行任何更改时必须复制数据并进行计算.

另一件事,我正在使用一个业务层来公开函数来获取这些数据(例如GetOrders(过滤器))并且我不需要每次都使用小计(或者某些时候只需要其中的一些),所以生成一个每次(即使从一个视图)子查询可能是一个坏主意.

是否有任何人可以指出我帮助我决定最佳设计的最佳实践?

顺便说一下,我最终做了#3主要是出于性能和查询简单性的原因.

更新:

很快就得到了很多很棒的反馈,谢谢大家.为了给出更多背景信息,显示信息的地方之一是在管理控制台上,我有一个可能很长的订单列表,需要为每个订单显示TotalCost,TotalPaid和TotalProfit.

Per*_*ion 4

汇总并存储统计数据以增强应用程序性能绝对没有任何问题。请记住,您可能需要创建一组触发器或作业来保持汇总与源数据同步。