最近要设计一个数据库表,大致是这样的。
类似于一般游戏中的好友系统,玩家都会有好友,表中要记录好友的友好度,同时如果A像B提出申请,还要记录A向B提出申请的时间。游戏中拥有两个列表,一个是我的申请,一个是我的审批列表。
然后问题来了,因为AB共享一个数据项,假设有字段applyid,approveid,applyid向approveid提出申请,然后插入一条记录。在以后的好友列表中,我需要查找A的好友,我需要两次查找,一次查找applyid,一次查找approveid,因为AB无论什么位置,都是好友,我要找A的全部好友,我就需要查找A主动提出申请加为好友,或是审批别人同意成为好友。
有想过左一式两份的拷贝,但是因为AB共享一个好友度,这样容易出错,所以这样的设计又放弃。
但是,两次的数据库查找效率有点低,不知道有人涉及过类似的问题吗?
谢谢大家。
类似于一般游戏中的好友系统,玩家都会有好友,表中要记录好友的友好度,同时如果A像B提出申请,还要记录A向B提出申请的时间。游戏中拥有两个列表,一个是我的申请,一个是我的审批列表。
然后问题来了,因为AB共享一个数据项,假设有字段applyid,approveid,applyid向approveid提出申请,然后插入一条记录。在以后的好友列表中,我需要查找A的好友,我需要两次查找,一次查找applyid,一次查找approveid,因为AB无论什么位置,都是好友,我要找A的全部好友,我就需要查找A主动提出申请加为好友,或是审批别人同意成为好友。
有想过左一式两份的拷贝,但是因为AB共享一个好友度,这样容易出错,所以这样的设计又放弃。
但是,两次的数据库查找效率有点低,不知道有人涉及过类似的问题吗?
谢谢大家。
applyid approveid type
TYPE用来标志是主动提出申请加为好友 OR 审批别人同意成为好友
关键在于在A和B的个人属性列表中,如果他们是好友,那么彼此的好友度应该是相同的。OK?
所以,好友表可以设计为:
身份ID 好友ID 申请方(0为别人主动申请,1为自己申请01) 申请时间 好友度 其它一 其它二A和B每个人都有一张这样的表,只不过他俩的表上,身份ID和好友ID以及申请方这三列的值是相反的。其它值可能基本相同。然后,某程序在修改好友度时,应该同时修改A和B的好友度,以使两者保持一致就可以了。
也就是说,好友度的一致性,不应该由数据库保证,而是由程序逻辑来保证。
applyid approveid type
TYPE用来标志是主动提出申请加为好友 OR 审批别人同意成为好友
一个是以我applyid为主搜索,一个是以approveid为主搜索。
刚开始涉及数据库,或者说mysql有没有一个语句可以解决这个需求。
select * from tt where applyid='a' or approveid='a'
如果我是主动申请的,那么我需要查找approveid,exp,approvetime,
如果我是被动申请的,我需要查找applyid,exp,approvetime,
这样的需求可以用一个sql语句完成吗?
select approveid,exp,approvetime from tt
union
selec applyid,exp,approvetime
) a where approveid='a'
参考了UNION关键字,有个疑问,这样的一条语句,与同时使用两条select的语句效率相比如何,是两条语句的查询代价吗?或是优化点,还是说只是一条语句的查询代价?
两条select的语句 是什么
索引情况如何,在approveid、applyid上建立复合索引没有
select * from tt where applyid='a' or approveid='a'->
select * from tt where applyid='a'
union
select * from tt where approveid='a'
如果你纠缠在applyid 和 approveid 上,就无解了,肯定查两次。