如何正确组织 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 链接。任务是为每个用户显示他所有订单的总和,可以有几千个(订单),也可能有几万个,同时可以有成百上千的用户同时发出请求。有两个选项:
- 对于每个新订单,除了写入订单 table 外,增加 orders_amount_total 计数器,然后简单地显示给用户。
- 删除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 中使用相同的列名称,除非它们表示相同的内容。
有两个 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 链接。任务是为每个用户显示他所有订单的总和,可以有几千个(订单),也可能有几万个,同时可以有成百上千的用户同时发出请求。有两个选项:
- 对于每个新订单,除了写入订单 table 外,增加 orders_amount_total 计数器,然后简单地显示给用户。
- 删除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 中使用相同的列名称,除非它们表示相同的内容。