亲爱的数据库专家/程序员:
我有一个带有用户信息的mysql表,例如
id user_id name etc.
1 userA
2 userB
3 userC
.. ..
.. ..
Run Code Online (Sandbox Code Playgroud)
我想创建一个像'跟随'其他用户的功能,如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
Run Code Online (Sandbox Code Playgroud)
现在我想找到谁跟随userA.我是这样的:从追随者中选择*,其中user_id = userA这将选择userB和userC.多数民众赞成我所需要的.
现在我想找到,userA正在关注哪些人(例如在上表中,userA跟随userC和userX.然后我应该从follower_id = userA的关注者那里运行类似Select*的东西.
我的问题是,这个数据库设计是否适合这个问题(考虑到数据库冗余和优化?)或者可以采用比这更好的方法?谢谢.
Mik*_*ll' 14
一般来说,您的设计是正确的.
但是,如果user_id在表"users"中是唯一的,则"users"中不需要"id"列.(包含唯一"id" 和唯一"user_id" 的单个表非常不寻常.)您也不需要表"followers"中的列"id".
"关注者"中的主键应该是(user_id,follower_id),并确保每个列都有一个引用"users"中"user_id"的外键.
Ire*_*ren 10
这是我的设计。
Id(PK) userId(FK) followerId(FK) followedDate unfollowedDate
1 123 456 YYYY-MM-DD HH:MI:SS YYYY-MM-DD HH:MI:SS
... ... ... ... ...
Run Code Online (Sandbox Code Playgroud)
我假设userId - followerId组合是唯一的。我可以将它们用作复合键并从表中删除Id。日期也很有用。例如,如果用户取消关注并在 5 分钟后再次关注,它不会生成通知 - 我认为用户是错误的。我还可以按日期分析以下统计数据。
一般提示。对 id 使用整数而不是字符串。存在显着的性能差异。因此删除users.user_id,并将users.id 重命名为users.user_id。其次,您的关注者表应该在 user_id 和 follower_id 上有索引。同样有显着的性能优势。我也喜欢在 (user_id, follower_id) 上有一个唯一索引的想法,称其为您的主键,并删除您的 id 列。
| 归档时间: |
|
| 查看次数: |
13177 次 |
| 最近记录: |