如何表示对称的多对多关系

tah*_*ala 8 database-design

假设我有一个名为USER的实体,并且在两个USER之间存在关系FRIENDSHIP,因为我有一个表'USER'和一个关系表'FRIENDSHIP'

__PRE__

在上表中,我存储了两次相同的信息,即"taher是deepak的朋友,而deepak是taher的朋友"

有没有办法减少这种冗余?

Jac*_*son 8

好吧,你当然可以假设所有的友谊都是对称的并且只存储一次这种友谊,但这意味着当你想要查询所有Taher的朋友时,你必须在任一列中查找他的ID.

或者,您可以拥有一个单独的关系ID表,然后是一个与用户关系的一对多表.这样做的好处是,如果有一天你想要它,它将允许多人关系,并允许你添加关于关系的元数据(当它开始时,谁建议它,无论如何).

   User                
Id    Name          
1     Taher         
2     Deepak        

Relationship              
Id     StartDate           
1      2010-08-23

UserRelationship
RelationshipId UserId
1                1
1                2
Run Code Online (Sandbox Code Playgroud)

另一方面,例如,在Facebook上,我可以"与朋友"交流,他们可以决定不与我交朋友.如果你没有现在正在使用的"冗余"方法,你将如何表现这种尚未互惠的友谊?


Bet*_*eth 5

制定一条规则,例如“第一个 ID 值始终低于第二个 ID 值”,这样您就可以确保不存在重复项。

在这种情况下,对 (4,1) 无效,对 (4,3) 将存储为 (3,4)。