【发布时间】:2020-01-19 09:54:58
【问题描述】:
我有 3 张桌子(customers、invoices、invoice_items)。
一个客户可以有多个发票,一个发票可以有多个项目。
这是我当前的架构:
客户
id
name
timestamps
发票
id
customer_id
timestamps
invoice_items
id
invoice_id
price
timestamps
注意:时间戳是 created_at 和 updated_at 字段。不用担心。
如您所见,我没有将发票的总金额存储在 invoices 表中。我让前端计算一下。
现在,我的客户有 1000 多个客户,他们希望在主页上显示所有客户以及他们拥有的所有发票的总和。
ID |客户名称 |总发票(所有发票的总和)
现在我正在使用 Laravel,所以我的查询如下所示:
$customers = Customer::with('invoices.items')->get();
最好的方法是什么?性能方面?
我应该只将每张发票的总金额存储在 invoices 表中,以避免查询项目并计算总和吗?比如:
发票
id
customer_id
total
timestamps
想象一个客户有数千张发票,每张发票有多个项目。查询会很慢,我必须在前端计算每一件事。
此外,发票一经制作,便无法更改。所以发票的总额是静态的。
【问题讨论】:
-
您可以像使用
SUM或COUNT聚合函数一样对查询中的所有发票求和。这样就可以得到查询中的所有数据。无需存储在表中。 -
是的,对于千条记录,前端计算可能会很慢,所以最好在查询中使用聚合函数。对于大量记录,查询将比前端计算相对更快。
-
您不想存储计算的总数。您必须确保在任何时候发生变化时重新计算它们。正如上面的评论中提到的,如果您的索引是正确的,那么显示客户及其总数的查询应该不会很慢。
-
我会说是的,因为一旦您说它无法更新,那将是出于某种原因。如果您真的想保存总计,尽管我会将它们放在您的
invoices表中。鉴于您提供的 3 张桌子,没有其他合乎逻辑的地方。 -
@wobsoriano - 我同意戴夫的观点。
标签: php mysql database laravel uitableview