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)
你的第二个选项,对字段名称稍作修改,因为跟随者和后面的用户都是两个用户名.如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)
| 归档时间: |
|
| 查看次数: |
3505 次 |
| 最近记录: |