日期:2014-05-16  浏览次数:20905 次

请教相互对应有序的表设计问题
最近要设计一个数据库表,大致是这样的。
类似于一般游戏中的好友系统,玩家都会有好友,表中要记录好友的友好度,同时如果A像B提出申请,还要记录A向B提出申请的时间。游戏中拥有两个列表,一个是我的申请,一个是我的审批列表。
然后问题来了,因为AB共享一个数据项,假设有字段applyid,approveid,applyid向approveid提出申请,然后插入一条记录。在以后的好友列表中,我需要查找A的好友,我需要两次查找,一次查找applyid,一次查找approveid,因为AB无论什么位置,都是好友,我要找A的全部好友,我就需要查找A主动提出申请加为好友,或是审批别人同意成为好友。
有想过左一式两份的拷贝,但是因为AB共享一个好友度,这样容易出错,所以这样的设计又放弃。
但是,两次的数据库查找效率有点低,不知道有人涉及过类似的问题吗?
谢谢大家。

------解决方案--------------------
"有想过左一式两份的拷贝,但是因为AB共享一个好友度,这样容易出错,所以这样的设计又放弃。"

这几乎不是一个数据库问题。
关键在于在A和B的个人属性列表中,如果他们是好友,那么彼此的好友度应该是相同的。OK?
所以,好友表可以设计为:
身份ID 好友ID 申请方(0为别人主动申请,1为自己申请01) 申请时间 好友度 其它一 其它二。。。

A和B每个人都有一张这样的表,只不过他俩的表上,身份ID和好友ID以及申请方这三列的值是相反的。其它值可能基本相同。然后,某程序在修改好友度时,应该同时修改A和B的好友度,以使两者保持一致就可以了。
也就是说,好友度的一致性,不应该由数据库保证,而是由程序逻辑来保证。

------解决方案--------------------
首先要确认一下需求

同意审核后,是默认相互都加好友,还是单向的?
如果是相互加的话,一旦好友关系确认后,是否有需求要知道当时是谁申请的?
------解决方案--------------------
select * from (
select approveid,exp,approvetime from tt
union
selec applyid,exp,approvetime
) a where approveid='a'