如何正确组织 MySQL 数据库中的相关表?

How to properly organize related tables in MySQL database?

有两个 table - 用户和订单:

id first_name orders_amount_total
1 5634200
2 迈克 3982830
id user_id order_amount
1 1 200
2 1 150
3 2 70
4 1 320
5 2 20
6 2 10
7 2 85
8 1 25

table 由用户 ID 链接。任务是为每个用户显示他所有订单的总和,可以有几千个(订单),也可能有几万个,同时可以有成百上千的用户同时发出请求。有两个选项:

  1. 对于每个新订单,除了写入订单 table 外,增加 orders_amount_total 计数器,然后简单地显示给用户。
  2. 删除orders_amount_total字段,并使用tables JOIN显示所有订单的总和,并使用SUM运算符计算特定用户的所有订单总和。

哪个选项更好用?为什么?为什么另一个选项不好?

P.S。我相信第二个选项是简洁和正确的,因为数据库是关系型的,但是对服务器上的负载有强烈的怀疑,因为计算金额时的样本即使对于一个用户来说也很大,而且有很多.

对于绝大多数情况,选项 2 是正确的。

选项 1. 会导致可能导致不一致的数据冗余。使用选项 2。您始终获得正确的值是安全的。

是的,反规范化表可以提高性能。但这是最后的手段,需要格外小心。 “数万”行对于 RDMBS 来说并不是一个特别大的集合。它们可以很好地处理数百万甚至更多。所以你似乎离最后的手段还很远,应该选择选项 1。和适当的索引。

我同意@sticky_bit 选项 2. 优于 1. 还有另一种可能性:

创建一个 VIEW,它是 JOIN/SUM 查询的预定义调用。一个聪明的 DBMS 应该能够推断出每次 orders table 更新时,它也需要为 user_id.

调整 orders_amount_total

顺便说一句,关于您的架构设计:不要命名列 id;不要在两个不同的 table 中使用相同的列名称,除非它们表示相同的内容。