【问题标题】:Many to many relationship and MySQL多对多关系和MySQL
【发布时间】:2014-03-24 09:41:04
【问题描述】:

如果我想创建一个包含订阅者的数据库(想想 YouTube),我的想法是有一个包含用户信息(如用户 ID、电子邮件等)的表。然后是另一个包含 2 列的表(subscriptIon 表):一个用于用户 ID 和一个用于新订阅者的用户 ID。

因此,如果我的用户 ID 是 101 并且用户 312 订阅了我,我的订阅表将更新为包含第 1 列中的 101 和第 2 列中的 312 的新行。

我的问题是,每次 101 获得新订阅者时,都会将他们的 id 添加到订阅表中,这意味着我无法真正为订阅表设置主键,因为每个用户 id 可以多次出现他们的订阅者和主键需要一个唯一的值。

另外,如果有很多订阅正在进行,搜索所有 101 的关注者会不会很慢,因为每次 101 排在第一个时都必须搜索并检查所有行列并检查第二列中的用户 ID(101 的订阅者)?

我的问题有更优化的解决方案吗?

谢谢!

【问题讨论】:

    标签: sql database


    【解决方案1】:

    在您的情况下,(user_id, subscriber_id) 对是唯一的(一个用户不能有另一个用户的两个订阅,可以吗?)。因此,如果需要,请创建一个包含两个字段的 compound primary key

    关于查询订阅表的速度:考虑您将在表上运行的查询,并添加适当的indexes。一个常见的操作可能是“给我一个我所有订阅者的列表”,这会转化为类似

    SELECT subscriber_id FROM subscriptions WHERE user_id = 123;
    

    (可能作为连接的一部分)。如果您已为user_id 列编制索引,则此查询可以非常高效地运行。

    【讨论】:

    • 非常有帮助!谢谢!
    【解决方案2】:

    在您的情况下,主键可以由两列组成,subscribesubscriber。而且由于搜索只会在整数值上,(没有文本搜索)它会很快。

    更多信息在这里:https://stackoverflow.com/a/2642799/1338574

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2012-07-16
      相关资源
      最近更新 更多