【发布时间】:2018-01-20 05:09:30
【问题描述】:
假设有三个表,用户、订单、交易,看起来像这样:
Users:
id | name
---------
1 | Mike
2 | Sara
Orders:
id | user_id | total | transaction_id
-------------------------------------
1 | 1 | 100 | 1
2 | 2 | 10 | 2
3 | 1 | 5 | 1
4 | 1 | 4 | 3
5 | 1 | 40 | 3
6 | 2 | 80 | 2
Transactions:
id | total | created_at
------------------------
1 | 105 | [timestamp]
2 | 90 | [timestamp]
3 | 44 | [timestamp]
假设我想选择 users.name 但对代表最近活动的名称进行排序(即按最近的交易)。
正如您所见,我需要的数据被删除了两次(可能是误用了这个词),因为我需要通过订单表找出最近的交易。
我想我会将其设计为尽可能规范化,但后来我意识到我不知道如何为这种情况和其他类似情况构建适当的查询。我显然可以提取所有数据并在应用程序代码中对其进行排序。我当然也可以在我保持同步的用户上添加一个“last_transaction_at”列。
所以我想这个问题有两个部分。首先是如何使用 SQL 查询来做到这一点,其次是这是否比反规范化效率更高或更低。
【问题讨论】:
-
如果两个用户有相同的名字,你到底想要什么?按具有该名称的某些用户的最近交易顺序列出的名称?还是一个列表,其中第 n 个元素是具有最近第 n 个交易时间的用户的名称?
标签: mysql sql database-design normalization database-normalization