"追随者"和"追随者"的数据库设计?

tcj*_*tcj 30 sql database

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

我有一个带有用户信息的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"的外键.

  • 这里的PK是(user_id, follower_id)的组合吗?如何查询表以获取 user_id 的关注者?因为当我这样做时,我可能没有followerId。所以,我很难理解两者的结合作为 PK 会有什么帮助。 (2认同)

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 分钟后再次关注,它不会生成通知 - 我认为用户是错误的。我还可以按日期分析以下统计数据。


bti*_*lly 6

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