“追随者”和“追随者”的数据库设计?

时间:2011-02-04 08:07:32

标签: sql database

亲爱的数据库专家/程序员:

我有一个包含用户信息的mysql表,例如

id      user_id         name etc.
1       userA            
2       userB   
3       userC
..      ..
..      ..

我想创建一个像'跟随'其他用户的功​​能,如twitter。 userA可以关注userB,或者userB可以关注userA,或者两者都可以互相关注。 为此,我应该创建1个表,让我们说追随者

id      user_id     follower_id
1           userA       userB
2           userC       userA
3           userA       userC
4           userB       userC
5           userX       userA

现在我想找一个关注userA的人。我是这样的: 从追随者中选择*,其中user_id = userA 这将选择userB和userC。这就是我需要的东西。

现在我想找到userA正在关注的人(例如在上表中,userA跟随userC和userX。然后我应该运行类似的东西 从关注者中选择*,其中follower_id = userA。

我的问题是,这个数据库设计是否正确解决了这个问题(考虑到数据库冗余和优化?)或者可以采用比这更好的方法?感谢。

4 个答案:

答案 0 :(得分:14)

一般来说,您的设计是正确的。

但是,如果user_id在表“users”中是唯一的,则“users”中不需要“id”列。 (包含唯一“id”唯一“user_id”的单个表格非常不寻常。)您也不需要“关注者”表中的“id”列。

“关注者”中的主键应该是(user_id,follower_id),并确保每个列都有一个引用“users”中“user_id”的外键。

答案 1 :(得分:4)

一般提示。使用整数表示id而不是字符串。存在显着的性能差异。因此,请删除users.user_id,并将users.id重命名为users.user_id。其次,你的关注者表应该有user_id和follower_id的索引。同样,还有显着的性能优势。我也喜欢在(user_id,follower_id)上设置一个唯一索引,调用你的主键,并删除你的id列。

答案 2 :(得分:3)

这是我的设计。

Id    userId(PK)  followerId     followedDate         unfollewedDate
1     123         456            YYYY-MM-DD HH:MI:SS  YYYY-MM-DD HH:MI:SS
...   ...         ...            ...                  ...

我假设 userId - followerId 组合是唯一的。日期可能很有用。例如,我正在考虑使用如果用户取消关注并在5分钟内再次关注,则不会生成通知。我假设用户误做了它。我可以按日期分析以下静力学。

答案 3 :(得分:1)

是的,您的设计是处理多对多关系的常用方式。搜索“建模多对多数据库”,您将找到许多资源,为您提供此示例。

将关系表中的外键添加到users表中。

如果您的关系涉及其他信息,您可以将其作为列添加到连接表中。例如,可能是一个用户开始关注另一个用户的日期。

如果您希望让其他表引用您的表,则连接表中的单独代理键(如您添加的ID列)非常有用。