首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化表设计或优化查询

优化表设计或优化查询
EN

Stack Overflow用户
提问于 2014-04-10 04:20:24
回答 1查看 32关注 0票数 0

我试图决定哪一个更好:设计一个浪费大量空间的表格,有一个简单的查询,或者写一个非常紧凑的表格,但是找到我要找的东西的过程会非常紧张。

实际的问题是:

想象一下你有一张非常简单的桌子。第一列为ID号,第二列是名称列表,第三列也是名称列表。第二栏是第三栏中欠人的名单。

搜索应执行以下操作:

我在第三栏中寻找一个名字,看看谁欠这个人在第二栏。一个或多个名字出现,然后我想看看谁欠他们,再次出现了一堆名字,以此类推到第5级。

也许这是一个众所周知的方案,在表设计或MySQL圈中有一个众所周知的简单答案。有人能建议一个MySQL查询,或者一个合适的表设计,我可以使用一个简单的查询吗?

示例

代码语言:javascript
复制
ID      owes        owned to
1       Peter       John
2       John        George
3       Abdul       George
4       George      Anna

所以我可以设计这样一张浪费的桌子

代码语言:javascript
复制
ID    1        2         3       4      5
1     Anna     George    Abdul  
2     Anna     George    John    Peter
3     George   Abdul
4     George   John      Peter
5     John     Peter

但这将是非常浪费和糟糕的设计,但它将是非常容易访问的数据,以及层次和欠款链。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-10 04:44:23

像这样的东西似乎是合适的:

代码语言:javascript
复制
people
+----+--------+
| id |  name  |
+----+--------+
|  1 | Marty  |
|  2 | Steven |
|  3 | John   |
+----+--------+

在表中建立人与人之间的关系:

代码语言:javascript
复制
loans
+-----------+-------------+
| lender_id | borrower_id |
+-----------+-------------+
|         1 |           2 |
|         1 |           3 |
|         2 |           1 |
+-----------+-------------+

您可以通过以下简单的方法让所有欠某个贷款人的人:

代码语言:javascript
复制
SELECT people.id, people.name
FROM loans
INNER JOIN people ON people.id = loans.borrower_id
WHERE loans.lender_id = X

其中X是贷款人的id。例如,考虑到lender_id of 1 (Marty)会产生这样的结果:

代码语言:javascript
复制
+----+--------+
| id |  name  |
+----+--------+
|  2 | Steven |
|  3 | John   |
+----+--------+

您可以对每个结果人员重复此过程,直到没有结果为止(没有人被拖欠)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22978579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档