我想实现一个关注/收藏系统。我可以想到两种实现数据库/表结构的方法,但不确定要实现哪一种。其中哪一项被认为是最佳实践,最重要的是为什么?
我把我所有的追随者放在一个字符串中。通过将所有追随者放在一个字符串中,它减少了冗余行的数量。
前任。
编号 (1) || 用户 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';
或者
我将每个 follow_id 单独放置,但通过为相同的 user_id 设置 3 行来增加冗余。
前任。
编号 (1) || 用户 ID (1) || 追随者 ID (2)
编号 (2) || 用户 ID (1) || 追随者 ID (3)
编号 (3) || 用户 ID (1) || 追随者 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';