代码之家  ›  专栏  ›  技术社区  ›  NinjaCat

数据库设计:总金额字段的放置位置

  •  4
  • NinjaCat  · 技术社区  · 15 年前

    我正在设计一个跟踪订单的应用程序。每个订单可以有一个工作项,每个工作项可以有一个单独的价格。

    我在workItem表中存储workItem的价格,认为在UI或报表中,收集作业成本(向客户计费和向承包商支付)将通过查询workItems表中的现有数据来计算。

    保持这种方式还是将总额存储在订单表中有意义?如果我选择后者,数据不是多余的吗?或许这样的举动是出于性能方面的考虑。你怎么认为?

    4 回复  |  直到 15 年前
        1
  •  6
  •   cletus    15 年前

    这取决于数据库的使用方式。

    理想的解决方案是在工作项行中保留单独的项。这样可以避免重复数据。例如,在添加或更新工作项时,必须同时更新工作项和总计。

    使用适当的索引,这样的查询通常会执行:

    SELECT i.*, SUM(wi.amount) total
    FROM invoice i
    JOIN workitem wi ON i.invoice_id = wi.invoice_id
    GROUP BY i.invoice_id
    

    如果

        2
  •  3
  •   CJM    15 年前

    如果您遵循标准化规则,您将忽略计算值,例如总计,并动态生成它们。

    就存储空间而言,现在在大多数平台上通常都不是问题,因此存储额外的数据也不是问题。有时,当以这种方式进行反规范化时,您可以提高性能或简化代码。同样,您的决策也会影响可维护性,或者增加复杂性。

    在您的示例中,如果根据订单存储总计,则每次修改项目时,都会命中workitem表,然后还必须更新订单表。这似乎没有什么好处,所以我不会走这条路。。。但正如我所说,在某些情况下,您可能会明智地选择存储数据,而不是动态派生数据。

        3
  •  2
  •   Paul Hadfield    15 年前

    正如您所说,性能和用法是正确描述的关键。现在正确的定义可能不是将来。

    一个要求可能是列出所有订单只是显示总价值。如果不存储该值,则必须为每个订单聚合订单项才能获得合计。如果将此值与order表一起存储,则不需要在表中包含order项。

        4
  •  2
  •   Bravax    15 年前

    除非性能有问题,否则我不会将总数存储在您的数据库中。

    而是根据报告或显示的需要动态计算。