设计具有用户之间关系的表格的好方法是啥?
Posted
技术标签:
【中文标题】设计具有用户之间关系的表格的好方法是啥?【英文标题】: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 关联的朋友的有效方法,或者随着表变大,这是否会对数据库造成很大的负担?如果是这样,有没有更好的查询方法? 这取决于你的需要,如果你想获得与特定用户相关的记录是可以的,但作为排序点,如果表中的记录增加,对记录进行排序需要时间。 【参考方案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】:我认为最好的方法无疑是按照您的建议创建一个表格。这将使您可以更好地管理朋友,对这张桌子上的朋友进行查询,......这将是最好的解决方案。
【讨论】:
以上是关于设计具有用户之间关系的表格的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 MySQL 中,对于连接谓词之间具有多对多关系的大型表,最有效的查询设计是啥?