【问题标题】:Data Model for Social Network?社交网络的数据模型?
【发布时间】:2011-05-09 19:05:39
【问题描述】:

如果我想创建一个允许用户拥有 0 个或多个“朋友”的网站,我将如何在数据库中为这种关系建模?这么简单的事情会起作用吗:

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

???

这是否允许我以后做 Facebook 所做的事情(例如“你的 3 个朋友认识这个用户,也许你也认识”)?还是像 6 度到 Kevin-Bacon 之类的?

编辑 1:

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

【问题讨论】:

  • 最近看过社交网络电影吗?
  • 哈哈。是的,但我不是因为那部电影才问的。我问是因为我正在解决类似的问题。 :)
  • 我对他的钱很满意,但对他的个性不满意:P

标签: mysql database database-design data-modeling


【解决方案1】:

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

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

每次您必须查询 DOR(关系度)时,您都必须初始化一个图并运行最短路径算法(这是我能想到的最少优化)。如果您的会员数量增加到几公斤,那么您将如何处理?

【讨论】:

  • 你觉得我的编辑 1 怎么样?它是否处理朋友确认?我要说的是(Fid_1,Uid_1)===(Uid_1,Fid_1)。我希望这是一个安全的假设。是否有 DB 方式来处理 DOR?
【解决方案2】:

您需要多对多关系 - 您可以有 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,该表将具有与关系表相同的数据库方案。确认后,您会将条目从pendingrelationships 移至relationships。

希望这会对你有所帮助。

【讨论】:

  • 我的设计不允许 M-M 关系吗?请参阅编辑 1,了解我提出的处理确认的解决方案。
  • 是的,你可以做到编辑 1 方式 :)
【解决方案3】:

@devfreak 是绝对正确的,但我不会制作“待定”表。这简直是​​多余的。朋友表可以有状态字段,可以根据状态查询。

【讨论】:

  • 挂起的表不是多余的,因为(可能)有大量记录,并且您将按状态排序/搜索。如果它是一个你应该索引的字段并且它是一个布尔值(或变化不大的东西),那么是时候拆分表了。
猜你喜欢
  • 2017-10-20
  • 1970-01-01
  • 2016-09-27
  • 2010-11-29
  • 2011-04-10
  • 1970-01-01
  • 2011-03-21
  • 2013-05-18
  • 2019-10-06
相关资源
最近更新 更多