【问题标题】:mysql optimize tablesmysql优化表
【发布时间】:2013-03-05 20:31:41
【问题描述】:

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

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

  1. 将每一个关系保存为一个条目,例如:

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

    (我声明了这三个人之间的关系)

  2. 保存每个人的姓名并列出他的朋友:

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

或者也许有更好的方法?

【问题讨论】:

  • 绝对确定 - 第一种方式。虽然 - 对人员使用数字 ID 号,而不是姓名。
  • 我想说,选项一,你的数据库变大了,但我没有预见到我会像选项 2 那样做时看到的任何问题,在选项 2 中插入和编辑会使它变得更加困难。个人意见这个。
  • #2 被认为是不好的做法,见stackoverflow.com/questions/3653462/…

标签: mysql optimization


【解决方案1】:

亲爱的,

您只需要一张桌子就可以建立朋友关系。结构如下我用过

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 号评论

Separate comma separated values from mysql table

【讨论】:

  • 但是我需要打印某个人的所有朋友,所以我需要名字,而且从另一个表中检索每个人的名字看起来不是很快(如果朋友的数量是超过 500 并且用户表中的条目超过 100k)
【解决方案2】:

毫无疑问,第一个是最好的,因为第二个不会尊重first normal form

你必须避免在同一列中有多个值,因为编辑会很痛苦

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

另外,就像 Randy 所说,您必须使用 ID,然后才能将它们与外键链接。

【讨论】:

  • 但是我需要打印某个人的所有朋友,所以我需要名字,而且从另一个表中检索每个人的名字看起来不是很快(如果朋友的数量是超过 500 并且用户表中的条目超过 100k)
  • 嗯,一个连接不会花费那么多,相信我 mysql 可以很容易地处理 100k 行,所以在这种情况下,我不会为了性能而牺牲规范化。它不会尊重第一范式
  • @MindaugasJakubauskas 另外,例如:您需要知道 john 是否是 Robert 的朋友...您要开始解析所有字符串并进行拆分吗?这对性能来说并不是很好,而且很痛苦。相反,如果没有选项 1,您只需进行普通选择,如果您以正确的方式设置索引,甚至不需要一秒钟。
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2011-07-25
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多