追随者的MySQL数据库结构

use*_*016 1 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';
Run Code Online (Sandbox Code Playgroud)

要么

我将每个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';
Run Code Online (Sandbox Code Playgroud)

Bra*_*ley 5

你的第二个选项,对字段名称稍作修改,因为跟随者和后面的用户都是两个用户名.如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';
Run Code Online (Sandbox Code Playgroud)