将朋友列表实现到数据库中的最佳方法? MySQL
Posted
技术标签:
【中文标题】将朋友列表实现到数据库中的最佳方法? MySQL【英文标题】:Best way to implement friends list into a database? MySQL 【发布时间】:2018-10-22 19:49:14 【问题描述】:所以我的项目有一个“朋友列表”,并且在 mysql 数据库中我创建了一个表:
名字A
名字B
主键(nameA,nameB)
这会导致很多条目,但是为了确保我的数据库是规范化的,我不知道还有什么方法可以做到这一点?
我的项目也使用 Redis。我可以将它们存储在那里。
当一个人加入服务器时,我必须搜索所有条目,看看他们的名字是nameA还是nameB,然后将这两个名字放在一起作为朋友,这也可能是低效的。
干杯。
【问题讨论】:
A 可能认为 B 是朋友,而 B 认为 A 只是熟人。您要考虑这一点(即每个用户都可以选择他们的朋友)还是只存储对(A-B = B-A)? 我不会使用名称作为主键。当两个名叫 John Smith 的人加入时会发生什么?为每个用户创建一个唯一 ID,将其用作您的主键。然后,您需要另一个将两个用户 ID 存储为一条记录的表来显示关系。 @ThorstenKettner B 必须接受 A 的友谊才能被放入数据库,基本上,每个人都需要一个朋友列表。不知道如何将它放入数据库,这是我想出的。 但是B可以接受A的友谊,而拒绝C的友谊吗?如果 B 拒绝了 C 的友谊,C 还能称 B 为朋友吗?这是你必须决定的事情。 A|B 是否应该与 B|A 有其他含义? 这和你需要的差不多。希望能帮助到你。 ***.com/questions/379236/… 【参考方案1】:这个任务很常见。您想存储 A|B 与 B|A 具有相同含义的对。由于表有列,因此两者中的一个将存储在第一列中,另一个存储在第二列中,但是首先存储谁,谁存储第二,为什么?
一种解决方案是始终先存储较小的 ID,然后存储较大的 ID:
用户 ID1 |用户 ID2 --------+-------- 1 | 2 2 | 5 2 | 6 4 | 5这样做的好处是您只存储每对一次,感觉很自然,但缺点是您必须在两个列中查找一个人,有时在第一列中找到他们的朋友,有时在第二列中找到他们的朋友。这可能会使查询有点笨拙。
另一种方法是冗余存储对(通常使用触发器):
用户 ID1 |用户 ID2 --------+-------- 1 | 2 2 | 1 2 | 5 2 | 6 4 | 5 5 | 2 5 | 4 6 | 2这里的查询更容易:在一列中查找此人,在另一列中查找他们的朋友。但是,所有对都重复看起来有点奇怪。而且你依赖于一些人不喜欢的触发器。
第三种方法是存储编号的友谊:
友谊 |用户身份 ------------+-------- 1 | 1 1 | 2 2 | 2 2 | 5 3 | 2 3 | 6 4 | 4 4 | 5这为配对中的两个用户提供了相等的价值。但是为了找到朋友,你需要通过:为一个用户找到朋友,在这些朋友中找到朋友。但是,设计非常清晰,甚至可扩展,即您可以拥有三个四个或更多用户的友谊。
没有一种方法真的比另一种更好。
【讨论】:
我不确定谁投了反对票,因为您的回答非常有帮助。感谢您的时间。我为你投票。以上是关于将朋友列表实现到数据库中的最佳方法? MySQL的主要内容,如果未能解决你的问题,请参考以下文章
将 MySQL 数据库导出到 SqlServer 数据库的最佳方法 [重复]
使用 phpMyAdmin 将使用长数字的电子表格导入 MySQL 的最佳方法