【问题标题】:How to properly organize related tables in MySQL database?如何正确组织MySQL数据库中的相关表?
【发布时间】:2021-09-28 00:46:58
【问题描述】:

有两个表——用户和订单:

id first_name orders_amount_total
1 Jone 5634200
2 Mike 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

这些表由用户 ID 链接。任务是为每个用户显示他所有订单的总和,可能有数千个(订单),可能有数万个,同时可能有成百上千的用户同时发出请求。有两种选择:

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

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

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

【问题讨论】:

  • 如你所说,可能有数千个(订单),可能有数万个,同时可能有成百上千的用户同时发出请求,我会建议更新用户表。

标签: mysql join sum relational-database


【解决方案1】:

选项 2. 适用于绝大多数情况。

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

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

【讨论】:

  • 非常感谢!请您对这种情况下的索引提出建议吗?
  • @orel-22:这取决于实际查询的详细情况。一个好的猜测应该是orders (user_id, order_amount) 上的复合索引,以支持连接并涵盖对它们求和的数量。
【解决方案2】:

我同意@sticky_bit 的观点,即选项 2. 优于 1。还有另一种可能性:

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

顺便说一句,重新设计您的架构:不要命名列id;不要在两个不同的表中使用相同的列名,除非它们的含义相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多