2013-02-28 100 views
1

我想实现一个关注/最喜欢的系统。我可以想到两种实现数据库/表格结构的方式,但我不确定要实施哪一种。哪一个将被视为最佳实践,最重要的是为什么?关注者的MySQL数据库结构

我把所有的追随者都放在一个字符串中。通过将所有追随者放入单个字符串中,可以减少冗余行的数量。

Ex。

id(1)|| user_id(1)|| follower_ids(2,3,45)

'CREATE TABLE `users` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `user_id` int(10) unsigned NOT NULL, 
     `follower_ids` text NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

OR

我把各自独立follow_id但由具有对于相同的USER_ID 3行添加冗余。

Ex。

id(1)|| user_id(1)|| follower_id(2)

id(2)|| user_id(1)|| follower_id(3)

id(3)|| user_id(1)|| follower_id(45)

'CREATE TABLE `users` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `user_id` int(10) unsigned NOT NULL, 
     `follower_id` int(10) unsigned NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
+0

非他们。他们都错过了索引,可能是最重要的。 – 2013-02-28 23:11:32

回答

4

您的第二个选项是对字段名称稍作修改,因为跟随者和跟随者都是user_id。如John所述,将外键添加到下表中的两个* _user_id字段。

此外,从来没有复数表名称。 '用户'和'关注'就足够了。我个人比较喜欢像'follow'这样的表格,它有一个像'xref_'这样的前缀,这样我就知道它只是一个允许多对多关系的交叉引用表(一个用户可以关注很多用户,而一个用户可能有很多关注用户)。

'CREATE TABLE `user` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `followed_user_id` int(10) unsigned NOT NULL, 
     `follower_user_id` int(10) unsigned NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
4

最好的方法是既不。你应该在关注表和追随者表之间有一个中间表。中间表只有两列。 follow_id和followers_id。 通过这种方法,您可以省略您提到的两种解决方案的缺点。你不必处理一个字符串,并且你没有重复的条目,只有索引的表演速度非常快。

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `user` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(255) unsigned NOT NULL, 
     .... 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
'CREATE TABLE `follow_user` (
     `user_id` int(10) unsigned NOT NULL, 
     `follower_id` int(10) unsigned NOT NULL, 
) 

因为你改变你的文章很多,我认为你的第二种方法更好,如果追随者是与用户相同。因为您只存储follow和用户的indexex以及一个很好的select查询来查看单个用户遵循的内容比解析和搜索字符串更好重复的条目没有问题,因为它们只是索引,并且没有问题。

+0

你可以给我一个表结构的例子,这样我可以更好地掌握? – user1307016 2013-02-28 23:16:36

+0

我添加了代码。还有什么你想要的吗? – MIIB 2013-02-28 23:22:25

+0

那么你如何去查询这些信息呢?像例如添加一个追随者? 我不完全确定为什么当你已经有一个用户表与所有用户(你命名你的用户表遵循)时,你需要一个关注者表? – user1307016 2013-02-28 23:26:16