【发布时间】:2012-01-27 16:56:15
【问题描述】:
为社交网站建立用户之间友谊的最佳方式是什么?
可能的状态是:
- 没有友谊
- 从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的类,select也很明显。
Friend 模型不是很好,因为它会将 person1 和 person2 作为字段,并且所有查找都需要选择 Friends with person1=A and person2=B OR person1=B and person2=A
Friend-Lookup: Friend.objects.filter(person1=A) union Friend.objects.filter(person2=A) #unclean 需要联合两个集合
分离 many2many 表
另一种选择是带有friends 字段的Friend 模型,这是一个many2many 字段,它恰好链接到两个人。然后选择匹配朋友字段中的一个人,然后只返回模型,其中人 B 可以通过从朋友集中减去 A 来提取。但这太过分了,因为任何朋友对象都不会有超过 2 个关联的人。
Friend-Lookup: Friendship.objects.filter(persons__contains=A) #查询两个表
那么,您认为存储友谊关系最简洁、最直观的解决方案是什么?有没有常见的模式怎么做?
【问题讨论】:
-
这里有一个很好的例子来说明你的第三个选项github.com/revsys/django-friendship/blob/master/friendship/…
-
这看起来像我在 2011 年寻找的东西。我需要它的项目现在被放弃了,但也许我可以使用它。如果您想在答案中解释这些模型的一些核心方面(此处不欢迎仅链接答案),我可以接受。
标签: django database models friend social-network-friendship