想象一下,我们有一个网站,用户可以阅读文章,查看照片,观看视频等等。每个“项目”都可能被评论,因此我们需要空间来保存那些评论。让我们讨论一下这种情况下的存储可能性。
分布式解决方案
我们显然可以为每个“item”创建单独的表,以便我们有像:
这样的表CREATE TABLE IF NOT EXISTS `article_comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`createdBy` int(11) DEFAULT NULL,
`createdAt` int(11) DEFAULT NULL,
`article` int(11) DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
然后显然是photo_comments
,video_comments
,依此类推。这种方式的优点如下:
缺点:
集中解决方案
另一方面,我们可以将所有这些表合并为两个:
CREATE TABLE IF NOT EXISTS `comment_types` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
和
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`createdBy` int(11) DEFAULT NULL,
`createdAt` int(11) DEFAULT NULL,
`type` int(11) DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
表comment_types
是一个字典,它包含注释项“type”的键值对及其名称,例如:
1:Articles
2:Photos
3:Videos
表comments
存储包含其他type
字段的常用数据。
优点:
缺点:
讨论:
type
上添加INDEX,或者大幅减少percormance的下降?答案 0 :(得分:1)
我不确定您为选项2列出的任何缺点都是严重的,使用简单的WHERE子句可以轻松完成数据导出,我不会担心性能。选项2已正确规范化,在现代关系数据库中,性能应该非常出色(如果需要,可以使用适当的索引等进一步调整)。
如果我能证明它对于性能,可伸缩性或其他原因是必要的,我只会考虑第一个选项 - 但必须说这似乎不太可能。