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

时间:2018-10-22 19:49:14

标签: java mysql sql redis

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

nameA

nameB

主键(名称A,名称B)

这将导致很多输入,但是要确保我的数据库被规范化,我不确定该怎么做?

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

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

干杯。

1 个答案:

答案 0 :(得分:0)

任务很常见。您想存储A | B与B | A含义相同的对。由于表中有列,所以这两个表中的一个将存储在第一列中,另一个存储在第二列中,但是谁存储在第一列,谁存储在第二列,为什么?

一种解决方案是始终先存储较小的ID,然后再存储较大的ID:

userid1 | userid2
--------+--------
1       | 2
2       | 5
2       | 6
4       | 5

这样做的好处是,每两对只存储一次,这很自然,但缺点是必须在两个列中查找一个人,有时在第一列和第二列中找到他们的朋友。这可能会使查询变得笨拙。

另一种方法是冗余地存储对(通常使用触发器):

userid1 | userid2
--------+--------
1       | 2
2       | 1
2       | 5
2       | 6
4       | 5
5       | 2
5       | 4
6       | 2

在这里查询更容易:在一个列中查找该人,在另一列中找到他们的朋友。但是,所有对都重复看起来有点奇怪。而且您依赖于某些人不喜欢的触发器。

第三种方法是存储编号的友谊:

friendship | user_id
-----------+--------
1          | 1
1          | 2
2          | 2
2          | 5
3          | 2
3          | 6
4          | 4
4          | 5

这为配对中的两个用户提供了相等的值。但是要找到朋友,您需要经过:找到用户的友谊,在这些友谊中找到朋友。但是,设计非常清晰,甚至可以扩展,也就是说,您可以拥有三个,四个或更多用户的友谊。

没有一种方法真的比其他方法好得多。