繁体   English   中英

使用类型列定义用户关系时的有效使用

[英]Efficient use when defining user relations with a type column

这是我的第一个! 快速淘汰:

场景我正在创建一个应用程序,您可以在其中挑战其他用户去做某事(例如,本周跑步4英里,下蹲3个盘,等等)。 我更多地是前端人员,所以我在某些数据库拖曳中遇到了一些问题,而其他方面则没有。

对于用户的友谊关系,我使用两行来显示往复运动。 我要求您作为朋友,并且我的uid和您的uid将放入关系表中。 一旦接受,就会添加相反的内容。

但是,当涉及到挑战时,我真的希望每个挑战仅使用一行,然后随进度进行更新。 类型0 =已发出挑战,1 =已接受挑战,2 =已完成挑战。

我还有另一个表,其中包含每个挑战的信息(条款,开始日期,结束日期,奖励等),因此每个挑战都将与Challenge_info表中的一行相关联–我只想/需要的另一个原因在挑战表中每个挑战有一行。

问题现在我遇到的问题是试图获取用户最新挑战的提要。 因此,请转到Tom的个人资料页面,您应该会看到他最近的活动清单:“ Tom向Amy挑战并获胜!Tom输给了John。等等。”

我可以将用户表保留在挑战表上,并获得特定用户的挑战,某些类型的挑战以及所有类似的东西,但是我找不到一种有效的方法来获取挑战者的用户名该用户或受到此用户挑战的用户。

桌子

__USER__

ID  UNAME  
1   Tom  
2   John  
3   Timmy  


__CHALLENGES__  
CID    Challenger_ID    Challenged_ID      Type  
1        1                2                 0  
2        1                3                 1  
3        2                1                 2  

CLIFFS定义这种关系的最有效方法是什么?如何加入这些表格,以便能够找到Tom所面临的所有挑战,但还能获得他所拥有的人的名字和关系(挑战或挑战)与之互动?

感谢您的时间和考虑!

只要索引Challenger_ID,使用2个左联接就不会有问题(我假设USER.ID被索引为PK):

select U1.uname, U2.uname from USER U1
left join CHALLENGES C on C.Challenger_ID = U1.ID
left join USER U2 on C.Challenged_ID = U2.ID

或仅使用内部联接:

select U1.uname, U2.uname from USER U1, USER U2, CHALLENGES C
where C.Challenger_ID = U1.ID AND C.Challenged_ID = U2.ID

执行计划会根据您的索引而有所不同,但是您可以理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM