亲爱的数据库专家/程序员:
我有一个包含用户信息的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。
我的问题是,这个数据库设计是否正确解决了这个问题(考虑到数据库冗余和优化?)或者可以采用比这更好的方法?感谢。
答案 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列)非常有用。