2011-02-04 57 views
25

尊敬的专家库/程序员:'followers'和'followings'的数据库设计?

我有一个MySQL表的用户信息,如

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

我想创建一个像“关注”其他用户的类似Twitter的功能。用户A可以关注用户B,或者用户B可以关注用户A,或者两者都可以关注对方。 为此,我要创建1台,可以说追随者

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

现在我想找到谁是下一个用户A。我很喜欢: 选择*从追随者哪里user_id = userA 这将选择userB和userC。那就是我需要的。

现在我想找到,用户A是下列哪些人(例如,在上表中,用户A是继用户C和用户X,然后我应该运行与追随者类似 选择*其中follower_id =用户A。

我问题是,这是数据库设计正确,此问题(考虑到考虑到数据库冗余和优化?)也可以有比这更好的办法?谢谢。

+0

顺便说一句,下面的** s **是错的 – 2018-02-12 18:07:49

回答

11

在一般情况下,你的设计是正确的。

但,如果user_id在“用户”表中是唯一的,则不需要“用户”中的列“id”。 (包含唯一“ID”的唯一表格是一个独特的“user_id”,这非常不寻常。)您也不需要表格“followers”中的“id”列。

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

5

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

+0

我同意你的主要观点,整数是更好的主/外键。然而,我认为他所称的'user_id`可能是'登录名'之类的东西(然后应该正确地重命名,但不能删除),这两者都是必需的,并且在系统内必须是唯一的。依照您的建议,'follow'表应该使用整数引用。 – 2011-02-04 15:46:37

1

是的,您的设计是处理多对多关系的常用方法。搜索“建模多对多数据库”,你会发现很多资源给你这个例子。

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

如果你的关系涉及到额外的信息,你会把它作为连接表中的列。例如,也许是一个用户开始关注另一个用户的日期。

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

0

这是我的设计。

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

我认为用户id - followerId combiation是独一无二的。日期可能有用。例如,我正在考虑如果用户取消关注并在5分钟后再次使用,则不会生成通知。我假设用户犯了错误。我可以按日期分析以下静态数据。