【发布时间】:2013-12-30 05:54:11
【问题描述】:
对于冗长的内容,我深表歉意,但我正在尝试为我正在开发的示例应用程序设计一个设计。下面我解释了一个示例案例、示例案例的Desired Queries,以及我的DB设计
我正在寻找有关如何改进我当前设计的建议,以便我能够回答我在示例部分中遇到的问题。
示例:
场景:
-
John 创建了两个主题 Math 和 Science
- 在数学中添加微积分和代数项,在科学中添加物理项
-
James 创建了两个主题 Math 和 Music
- 在数学中添加预计算项,在音乐中添加摇滚
-
Lisa 创建了两个主题 Math 和 CompSci
- 将线性代数项添加到数学,将 Java 项添加到 CompSci
-
John 与 James 分享他在数学主题中的项目演算
- James 接受该项目
- James 与 Lisa 共享同一个项目
- Lisa 接受物品
所需查询:
约翰
- 主题列表和每个项目的数量将显示:
- 数学 - 2,科学 - 1
- Math 中的项目列表将显示每个项目的共享计数和共享者
- 微积分 - 2 - 你,代数 - 0 - NULL
詹姆斯
- 主题列表和每个项目的数量将显示:
- 数学 - 2,音乐 - 1
- Math 中的项目列表将显示每个项目的共享计数和共享者
- 微积分 - 2 - James,Pre-Calc - 0 - NULL
丽莎
- 主题列表和每个项目的数量将显示:
- 数学 - 2, CompSci - 1
- Math 中的项目列表将显示每个项目的共享计数和共享者
- 微积分 - 2 - 詹姆斯,线性代数 - 0 - NULL
当前的数据库设计
用户:
ID username
---- ----------
1 John
2 James
3 Lisa
主题
ID Topic_Name User_id
--- --------- --------
1 Math 1
2 Science 1
3 Math 2
4 Music 2
5 Math 3
6 CompSci 3
物品
ID Item_Name Topic_Id
--- ---------- ----------
1 Calculus 1
2 Algebra 1
3 Physics 2
4 Pre-Calc 3
5 Rock 4
6 Linear Algebra 5
7 Java 6
分享
ID Item_Id Sent_user_id Accepted_user_id
--- ------- ------------- -----------------
1 1 1 2
1 1 1 3
对我来说,上述数据库设计很有意义,但我无法获得我想要的查询结果。我不确定我的查询是否可以改进,或者我应该更改我的设计以更适合我想要的查询
查询 1:按用户 ID 获取主题及其项目数
-- This only works for certain cases
SELECT t.topic_name, count(topic_name) as item_count
FROM Topics t
INNER JOIN Items i on i.topic_id = t.id
INNER JOIN User on u.id = t.user_id
INNER JOIN Share s on s.item_id = i.id
WHERE u.id = 1
GROUP BY t.topic_name
上述查询为John
返回以下内容topic_name item_count
----------- ------------
Math 3
Science 1
但它应该为John
返回以下内容topic_name item_count
----------- ------------
Math 2
Science 1
应该为James返回关注
topic_name item_count
----------- ------------
Math 2
Music 1
应该为Lisa
返回关注topic_name item_count
----------- ------------
Math 2
CompSci 1
请注意,item_count 对于 James 应该是 2。我相信上述查询适用于其他用户。
查询 2:通过 USERID 获取项目及其共享计数以及最初共享它们的人
--I'm not sure how to start on this. I've tried union with Items table and Share table
-- but that also works only for few users and not for all cases.
对于 John 对于我期望的数学:
Item Name Share Count Orig Shared By
--------- ----------- -----------------
Calculus 2 You
Algebra 0 NULL
詹姆斯数学:
Item Name Share Count Orig Shared By
--------- ----------- -----------------
Calculus 2 James
Pre-Calc 0 NULL
Lisa for Math:
Item Name Share Count Orig Shared By
--------- ----------- -----------------
Calculus 2 James
Linear Algebra 0 NULL
更新
根据 cmets 和答案,我稍微更改了 DB Schema。我制作了一个单独的连接表,用于建立用户-主题-项目之间的关系。
请看这个 sql fiddle:http://sqlfiddle.com/#!4/15211/15
但我仍然需要查询方面的帮助。我觉得我很接近了。
【问题讨论】:
-
为什么你觉得你现在的设计效率不高?你希望得到什么?只是好奇。
-
我希望得到两个查询的答案,这将回答每个用户的问题。我认为当前的设计没有达到标准,因为我很难对我的两个问题提出疑问。 1)获取每个用户的主题,包括每个用户的项目数(包括共享数),例如James Sub-bullet one 2)获取每个项目的共享计数,包括共享计数,例如詹姆斯子子弹二
-
我已经编辑了我想要提供更多洞察力的查询。
-
我会在某些方面改变你的设计。 1 - 我会用独特的主题制作主题表; 2-我会为它做同样的事情。 Itens 将是独一无二的,我将在 Itens 和 Topics 之间有一个 n-m 表(Cauculus 可以是数学或科学,因为物理是一个项目)。最后我会在 itemTopics 和 Users 之间有一个 N-M 表。
标签: mysql sql database-design relational-database database-schema