将朋友列表实现到数据库的最佳方法?MySQL

Arc*_*hie 0 java mysql sql redis

所以我的项目有一个“朋友列表”,并且在 MySQL 数据库中我创建了一个表:

姓名A

姓名B

主键(名称A,名称B)

这将导致大量条目,但为了确保我的数据库标准化,我不确定还有什么方法可以实现这一点?

我的项目也使用Redis..我可以将它们存储在那里。

当一个人加入服务器时,我必须搜索所有条目,看看他们的名字是nameA还是nameB,然后将这两个名字放在一起作为好友,这也可能效率低下。

干杯。

Tho*_*ner 5

这个任务很常见。您想要存储 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

这为配对中的两个用户提供了同等的价值。但要找到好友,需要经过两道关卡:找到用户的好友,找到这些好友中的好友。然而,设计非常清晰,甚至可扩展,即你可以拥有三四个或更多用户的友谊。

没有一种方法真的比另一种更好。