2012-10-22 56 views
5

我想创建一个朋友系统(类似于facebook)。mysql优化表

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

  1. 要保存everysingle关系为一个条目,如:

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

    (在那里我宣布所有这3人之间的关系)

  2. 为了保存每个人的名字和列出他的朋友:

    id | people | friends 
    1 | fred | mary, john 
    2 | mary | john, fred 
    3 | john | fred, mary 
    

或者,也许还有更好的办法?

+0

我会说,选项一,你的数据库变得更大,但我不认为任何问题我看到,当我做它像选项2,插入和编辑选项2会使它更难。 Persnoal认为这一点。 – Dorvalla

+0

#2被认为是错误的做法,请参阅http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database-column-really-that-bad –

+0

绝对确定 - 第一种方式。尽管 - 为人们使用数字身份证号码,而不是姓名。 – Randy

回答

11

不,亲爱的,

你只需要一个单一的表格为朋友关系。结构如下我已使用

id(主键)| my_id(整数记录的用户ID)|

像我们有我们的用户表中的两个用户,那么我们有两个项目既为用户进行关系相互

id | name | age 
1 | vipan | 12 
2 | karan | 12 
friend_id(其他用户,他会收到来自登录用户的好友请求的整数用户ID)

则条目应

id | my_id | friend_id 
1  1  2 
2  2  1 

请不要否决在任何情况下,但我用在我的网站上的这个表的结构,这是joomsocial此使用相同的结构最好是表结构我想,所以我用它请不要使用逗号分隔的值在表ES在加入和在某些情况下,关系

请参见第4号评论在这下面的帖子的链接

Separate comma separated values from mysql table

+1

请参阅这篇文章中的4号码评论 http://stackoverflow.com/questions/9906430/separate-comma-separated-values-from-mysql-table – 2012-10-22 12:49:30

+0

但我将需要打印某人的所有朋友,所以我将需要名称,并且它不会很快从另一个表中检索每个人的姓名(如果朋友的数量高于500,并且用户表中的数字高于100k) –

4

第一个是最好的无疑是导致第二个,他们会让问题不会尊重first normal form

你必须避免在同一列多个值的原因是会得到真正的痛苦编辑

Here的有关数据库规范化的链接。大多数时候,我们尊重第三种正常形式,因为它是正常化和性能之间的良好折衷。

另外,就像Randy说的那样,你必须使用这些ID,然后你可以将它们与一个外键链接起来。

+0

但我需要打印所有朋友的一些人,所以我会需要名称,并且它看起来不是很快从另一个表中检索每个人的名字(如果朋友的数量将超过500,并且用户表中的条目超过100k) –

+0

那么,加入不会花费那么多,并相信我mysql可以处理100k行非常容易,所以对于这种情况下,我不会牺牲性能的规范化。它不会尊重第一范式 – Marc

+0

@MindaugasJakubauskas另外,例如:你需要知道约翰是否是罗伯特的朋友......你会开始解析所有的字符串和分裂?这对性能不是很好,而且很痛苦。相反,在选项1中,你只需进行正常的选择,如果你将索引设置为好的方式,它甚至不会花时间。 – Marc