多对多的关系和MySQL

时间:2014-03-24 09:41:05

标签: sql database

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

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

的内容
SELECT subscriber_id FROM subscriptions WHERE user_id = 123;

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

答案 1 :(得分:0)

主键可以由两列组成,subscribesubscriber。而且由于搜索只会是整数值,(没有文本搜索)它会很快。

此处有更多信息:https://stackoverflow.com/a/2642799/1338574