在关系型数据库中建模好友和关注者

3
我正在尝试决定在关系数据库中建模记录关系的最佳方法。这是一个经典的好友/关注模型:
- 一个用户可以有零到多个好友。 - 一个用户可以有零到多个关注者。
好友和关注者都是用户本身。
那么,如何最好地建模呢?谢谢!
1个回答

13

用户表 (用户ID, ...)
订阅关系表 (订阅者, 发布者)
好友关系表 (第一个用户, 第二个用户)

CREATE TABLE Users (
    UserID int not null primary key,
    ...
)

CREATE TABLE Subscription (
    Subscriber int not null references Users(UserID),
    Publisher int not null references Users(UserID),
    constraint ck_NotEqual check (Subscriber <> Publisher)
)

CREATE TABLE Friendship (
    FirstUser int not null references Users(UserID), 
    SecondUser int not null references Users(UserID),
    constraint ck_Order check (FirstUser < SecondUser) -- since friendship is reflective
)

由于如果A是B的朋友,B也是A的朋友。我们可以记录两个关系,也可以只保留一个。通过这个检查约束,我们强制第一个用户的ID始终小于第二个用户的ID,因此我们始终知道如何检查友谊并且不会有重复。 - Mehrdad Afshari
如果没有回应的“潜在朋友”就是“追随者”吗?否则,我可能会保持友谊表不对称:一个条目将记录UserA认为UserB是朋友,另一个条目将记录UserB认为UserA是朋友。 - Jonathan Leffler
@Jonathan:我同意你需要能够存储一个尚未接受的“好友邀请”。或许可以再建一个表Invitations,它是定向的,并包括邀请日期(以防需要过期等)。一旦收件人接受,它就会移动到Friendship表。 - Bill Karwin
每个朋友关系解决方案有两行的优点,但是在类似的社交网络项目中工作过后,我认为这种处理方式要少得多问题。 - Mehrdad Afshari
我注意到你不能关注自己,例如 Twitter 就有效地执行了这一点。但是我能理解你为什么不想在数据库中处理这个问题。 - deworde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接