所以我的项目有一个“朋友列表”,并且在MySQL数据库中创建了一个表:
nameA
nameB
主键(名称A,名称B)
这将导致很多输入,但是要确保我的数据库被规范化,我不确定该怎么做?
我的项目也使用Redis。我可以将它们存储在这里。
当一个人加入服务器时,我将不得不搜索所有条目以查看他们的名字是nameA还是nameB,然后将这两个名字作为朋友放在一起,这也可能效率不高。
干杯。
答案 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
这为配对中的两个用户提供了相等的值。但是要找到朋友,您需要经过:找到用户的友谊,在这些友谊中找到朋友。但是,设计非常清晰,甚至可以扩展,也就是说,您可以拥有三个,四个或更多用户的友谊。
没有一种方法真的比其他方法好得多。