【问题标题】:What is a good way to design a table with relationship between users?设计具有用户之间关系的表格的好方法是什么?
【发布时间】:2011-10-06 15:20:10
【问题描述】:

我目前正在开发一个社交网站。 (是的,我知道,有一大堆。我不想让 Facebook 彻底崩溃)

我想知道是否有人能告诉我我的思维方式是否有问题,或者它是否真的是这样。

我希望用户能够有朋友。而且,为此,我认为我应该有一个这样的用户表: 用户

  • uId
  • 用户名
  • 电子邮件
  • 等等..

这应该是 1:N 的关系,所以我认为“联系人”表应该包含用户及其朋友的列表,如下所示: 联系方式

  • uId(来自用户)
  • FriendId(来自 USER 表)
  • 友谊类型 ENUM[Active, Inactive, Pending]

根据 uId 对该表进行排序是否是一种有效的解决方案,以便查询结果类似于以下内容:
用户名 |朋友ID
1 | 2
1 | 6
1 | 97
75 | 1
75 | 34

或者有什么不同的解决方案?

【问题讨论】:

  • 您能否解释一下“对这张表进行排序是否是一种有效的解决方案...”的意思。更具体地说,你为什么要对数据进行排序?您是否正在查询表并返回具有不同 uID 的大量行?
  • 我想知道这是否是选择与给定 uId 关联的朋友的有效方法,或者随着表变大,这是否会对数据库造成很大的负担?如果是这样,有没有更好的查询方法?
  • 这取决于你的需要,如果你想获得与特定用户相关的记录是可以的,但作为排序点,如果表中的记录增加,对记录进行排序需要时间。

标签: mysql database-design social-networking


【解决方案1】:

如果您只是想选择一组特定用户的朋友,查询将很简单,您不必担心性能问题。

例如:如果您希望返回 UID 8 的朋友的 id,您可以执行以下操作:

Select FriendId FROM TABLE where UID=8;

在您的情况下,由于 UID 列不是唯一的,因此请确保在此列上有一个索引以允许快速查找(优化性能)。

您可能还想考虑您还需要哪些有关用户朋友的其他数据。例如,仅获取 FriendIds 可能没有用,您可能想要名称等。因此您的查询可能看起来更像:

Select FriendId, Users.name FROM Friends JOIN Users ON Users.uid=Friends.FriendId WHERE Friends.UID=8; 

再次重申,对正确的列进行索引是优化查找的关键,尤其是当您的表变大时。

此外,由于与您执行的查找查询数量相比,添加朋友的行为可能非常少见,因此请务必选择提供最快查找速度的数据库引擎。在这种情况下,MyISam 可能是您最好的选择。 MyISam 使用表级锁定进行插入(即较慢的插入),但查找速度很快。

祝你好运!

【讨论】:

    【解决方案2】:

    我认为最好的方法无疑是按照您的建议创建一个表格。这将使您可以更好地管理朋友,对这张桌子上的朋友进行查询,......这将是最好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 2019-02-13
      • 2023-04-08
      • 1970-01-01
      • 2018-04-02
      • 2019-12-05
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多