追随者的MySQL数据库结构

时间:2013-02-28 23:09:23

标签: php mysql database

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

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

实施例

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行来增加冗余。

实施例

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';

2 个答案:

答案 0 :(得分:5)

你的第二个选项,对字段名称略有修改,因为跟随者和后面的人都是两个用户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';

答案 1 :(得分:4)

最好的方法都不是。你应该在follow table和followers表之间有一个中间表。中间表只有两列。 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和index的indexex以及一个好的select查询来查看单个用户遵循什么比解析和搜索字符串更好的方法重复的条目没有问题因为它们只是索引而且没有问题