为社交网站建模用户之间的友谊的最佳方式是什么?
可能的状态是:
- 没有友谊
- A到B的FriendRequest,B需要确认(这个是不对称的)
- A 和 B 是朋友(这是对称的)
现在选择正确的模型很复杂。
我的朋友是我个人资料的一部分
很明显,A.profile.friends 与其他用户是多对多关系。
- 没有友谊:B 不在 A.friends 中,A 不在 B.friends 中
- A请求与B建立友谊:A.friends中的B
- 朋友:A.friends 中的 B 和 B.friends 中的 A
但是将friend与friendrequest关系合并似乎很不干净。如果没有这种合并,数据是多余的,因为“B.friends 中的 A 而不是 A.friends 中的 B”将是未定义的状态。
Friend-Lookup: A.friends.filter(friends__contains=B) #相当复杂的数据库级别查找,对编码人员来说不直观
单独的表
FriendRequest 很明显,一个有 requester 和 requested_user 的类,选择也很明显。
朋友模型不是很好,因为它会将 person1 和 person2 作为字段,并且所有查找都需要选择具有 person1=A 和 person2=B 或 person1=B 和 person2=A 的朋友
Friend-Lookup: Friend.objects.filter(person1=A) union Friend.objects.filter(person2=A) #unclean 需要联合两个集合
分离 many2many 表
另一种选择是带有friends字段的Friend模型,这是一个many2many字段,它恰好链接到两个人。然后选择匹配朋友字段中的一个人,然后只返回模型,其中可以通过从朋友集中减去 A 来提取人 B。但这太过分了,因为任何朋友对象都不会有超过 2 个关联的人。
Friend-Lookup: Friendship.objects.filter(persons__contains=A) #查询两个表
那么,您认为存储友谊关系最简洁、最直观的解决方案是什么?有没有常见的模式如何做到这一点?