【问题标题】:mysql friend system, index, foreign key, prim keymysql好友系统、索引、外键、主键
【发布时间】:2013-05-07 15:42:11
【问题描述】:

我正在为我的网站建立一个朋友系统。我正在考虑只制作 2 行,在每行上添加一个索引,并将它们设为 usersid 列的外键。如果其中任何一个用户被删除,我希望它们被删除。然后每个用户都会有一个记录。

user_id
friend_id
  1. 问题:您认为有什么理由要包含主键吗?

  2. 问题:将外键设置为级联时,外键的功能是否如上所述?

如果您有任何其他建议或专栏建议,我也想听听(:(我不需要知道友谊何时开始)

谢谢!

【问题讨论】:

    标签: mysql indexing foreign-keys


    【解决方案1】:

    绝对需要一个主键。在这种情况下,最好在两列上使用复合主键。没有它,您的查询将比应有的速度慢得多,并且您将无法强制好友对的唯一性。

    您应该考虑的另一件事是朋友关系是单向关系还是双向关系。换句话说,您是否需要能够在任一方向(从任一用户开始)查找好友关系。如果是这样,您可能需要为每个朋友关系在该表中插入两行。

    关于级联删除,您需要确保在两列上都设置了这样的级联,以便在用户表中删除用户,它将删除关系表中该用户所在的所有行用户或朋友。

    【讨论】:

    • 好答案。但是我很难看到如果我添加一个名为 id 的列作为主键,那么我将永远不会从该 id 查找表。那么它如何提高性能呢?我确实在 user_id 上有一个索引,这是我将在我的 select 语句的 where 子句中“引用”的索引。并不是说我添加 id 有问题,我只是想了解原因。
    • @JensAhlstenHerlevsen 我不建议您添加自动增量主键列。我特别提到了使用这两列的复合主键。您可以对这对强制执行唯一性,并且您总是通过 user_id 查找,这是索引中的第一列,您不需要单独在 user_id 上建立单独的索引。您几乎应该在每张桌子上都有某种主要类型。
    • ALTER TABLE 好友添加主键 (user_id,friend_id);这是否也意味着 2 列的组合将是唯一的?
    • @JensAhlstenHerlevsen 这是正确的。唯一性是在这对值上强制执行的,这就是您想要的。
    • 好的。并且将其四舍五入,以确保:在 2 个表上创建主键后,每个表上的索引都是多余的?
    猜你喜欢
    • 2011-08-16
    • 2018-10-02
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2010-11-01
    • 2011-07-01
    相关资源
    最近更新 更多