MySQL 优化表

5

我希望创建一个朋友系统(类似于Facebook)。

我想将关系数据保存在MySql中,但我不知道哪种方式更好:

  1. To save everysingle relationship as a single entry, such as:

    id | people1 | people2
    1  | john    | maria
    2  | john    | fred
    3  | maria   | fred
    

    (there i declare relationships between all of these 3 peoples)

  2. To save everyone name and list his friends:

    id | people | friends
    1  | fred   | mary, john
    2  | mary   | john, fred
    3  | john   | fred, mary
    
也许有更好的方法吗?

绝对肯定 - 第一种方式。尽管如此 - 对于人员,请使用数字ID号码而不是名称。 - Randy
我会说,选项一,你的数据库会变得更大,但我不预见到任何问题,而如果按照选项二来做,插入和编辑会变得更加困难。这是我的个人意见。 - Dorvalla
#2 被认为是不良实践,参见 https://dev59.com/gHA65IYBdhLWcg3wvxaE - Alex K.
2个回答

11

不需要,你只需要一个表来建立朋友关系。结构如下:

id(主键)| my_id(整数类型的已登录用户ID)| friend_id(整数类型的另一个用户ID,该用户将从已登录用户那里收到好友请求)

就像我们在用户表中有两个用户一样,我们需要为每个用户创建两个条目,以建立彼此之间的关系。

id | name | age
1  | vipan | 12
2  | karan | 12

输入应该是

id | my_id | friend_id
 1     1        2
 2     2        1

请不要在任何情况下投票反对,但我在我的网站中使用了这个表结构,这是JoomSocial使用的相同结构,我认为这是最好的表结构,所以我使用它,请不要在表中使用逗号分隔的值,它们会在某些情况下导致连接和关系问题。

请查看以下文章中的评论第4条

从MySQL表中分离逗号分隔的值


1
请查看此帖子中的4个数字注释: http://stackoverflow.com/questions/9906430/separate-comma-separated-values-from-mysql-table - user1645055
但我需要打印某个人的所有朋友,因此我需要名字,从另一个表中检索每个人的名字看起来不是很快(如果朋友数量超过500且用户表中的条目超过100k)。 - Mindaugas Jakubauskas

4
第一个显然是最好的,因为第二个不会遵守第一范式
您必须避免在同一列中使用多个值,因为编辑起来会非常痛苦。 这里是关于数据库规范化的链接。大多数情况下,我们遵循第三范式,因为它是规范化和性能之间的良好折衷。
此外,正如Randy所说,您必须使用ID,这样就可以使用外键将它们链接起来。

但我需要打印某个人的所有朋友,因此我需要名字,从另一个表中检索每个人的名字看起来不是很快(如果朋友数量超过500且用户表中的条目超过100k)。 - Mindaugas Jakubauskas
嗯,连接并不会花费太多,相信我,MySQL可以轻松处理10万行数据,所以在这种情况下,我不会为了性能而牺牲规范化。这不符合第一范式。 - Marc
@MindaugasJakubauskas 另外,例如:你需要知道 John 是否是 Robert 的朋友... 你会开始解析所有字符串并分割吗?这对性能来说不是很好,而且很痛苦。相反,使用选项1,您只需执行普通选择操作,如果正确设置索引,则甚至不需要一秒钟。 - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接