设计具有用户关系的表的好方法是什么?

时间:2011-10-06 15:20:10

标签: mysql database-design social-networking

我目前正在开发一个社交网站。 (是的,我知道,他们中有很多人。我不是想让Facebook全部结束)

我想知道是否有人可以告诉我,我的思维方式是否已经取消,或者是否实际上是这样做的。

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

  • 的uId
  • 的userName
  • 电子邮件
  • 等。

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

  • uId(来自USER)
  • FriendId(来自USER表)
  • 友谊类型ENUM [有效,无效,待定]

在uId上对此表进行排序是否是一种有效的解决方案,以便查询结果与此类似: uID | friendId
1 | 2
1 | 6
1 | 97
75 | 1
75 | 34

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

2 个答案:

答案 0 :(得分: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使用表级锁定进行插入(即较慢的插入),但查找速度很快。

祝你好运!

答案 1 :(得分:0)

我认为最好的方法是毫无疑问地创建一个像你提议的表格。这将使您能够更好地管理朋友,在此表上为朋友查询,...这将是最佳解决方案。