如果我想创建一个允许用户拥有0个或更多“朋友”的网站,我将如何在数据库中建模这样的关系?这件事情有点简单:
Table Friends
- Id (PK)
- UserId (FK)
- FriendId (FK)
???
这是否允许我稍后做像Facebook这样的事情(例如“你的3个朋友知道这个用户,也许你也这样做了”)?或者类似6度到凯文 - 培根的东西?
编辑1:
Table Friends
- UserId (FK)
- FriendId (FK)
- Status ('Pending', 'Approved', 'Rejected', 'Blocked'?)
答案 0 :(得分:2)
这会奏效。以下是需要注意的要点:
每次你必须查询DOR(关系度)时,你必须初始化一个图并运行Shortest Path Algo(这是我能想到的最少的优化)。如果你的会员数增加到几公斤那么你将如何处理呢?
答案 1 :(得分:1)
你需要多对多的关系 - 你可以有0个或更多的朋友,每个朋友可以有0个或更多的朋友。最常见的方法是绑定附加表中的两个用户。您只需要一个额外的数据库表:
create table Relationships(
user1 int not null references Users(id),
user2 int not null references Users(id)
);
您肯定想为user1和user2创建索引。
我认为您不需要ID列。如果我是你的朋友,你是我的朋友,你应该知道的另一件事。当您将([u1],[u2])插入关系表时,如果存在关系([u1],[u2])或([u1],[u2]),请先检查。如果存在这样的关系,不要插入另一个,这可能会打破你的逻辑。
如果您需要某些类似的确认,例如在大多数流行的社交网络中,您应该创建另一个表PendingRelationsihps,它将具有与关系一个相同的DB方案。确认后,您将把条目从待定关系转移到关系关系。
希望这会对你有所帮助。
答案 2 :(得分:0)
@devfreak是绝对正确的,但我不会制作“待定”表格。这简直是多余的。 friend表可以有一个status字段,您可以根据状态查询它。