社交网络的数据模型?

时间:2010-11-14 10:52:33

标签: mysql database database-design data-modeling

如果我想创建一个允许用户拥有0个或更多“朋友”的网站,我将如何在数据库中建模这样的关系?这件事情有点简单:

Table Friends
- Id (PK)
- UserId (FK)
- FriendId (FK)

???

这是否允许我稍后做像Facebook这样的事情(例如“你的3个朋友知道这个用户,也许你也这样做了”)?或者类似6度到凯文 - 培根的东西?

编辑1:

Table Friends
- UserId (FK)
- FriendId (FK)
- Status ('Pending', 'Approved', 'Rejected', 'Blocked'?)

3 个答案:

答案 0 :(得分:2)

这会奏效。以下是需要注意的要点:

  • 你有朋友确认的东西吗?如果是,您将不得不考虑如何存储“待定”
  • 为UserId和FriendId编制索引。这些是您将加入表格的值。
  • 无序对(UserId,FriendId)是主键的竞争者。
  • 假设Uid_1和Fid_1是Uid_1!= Fid_1的朋友,那么你的朋友表存储(Fid_1,Uid_1)以及(Uid_1,Fid_1)。
  • 您要搜索的关系程度有多远。

每次你必须查询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字段,您可以根据状态查询它。