想象一下,我们有一个网站,用户可以在那里阅读文章、查看照片、观看视频等等。每个“项目”都可能会被注释,所以我们需要空间来保存注释。让我们讨论一下这种情况下的存储可能性。
分布式解决方案
显然,我们可以为每个“项”创建单独的表,这样我们就拥有了如下表:
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,等等。这种方法的优点如下:
缺点:
许多tables
集中式解决方案
另一方面,我们可以将所有这些表合并成两个:
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上添加索引以删除或大幅减少这种性能下降?。
发布于 2011-10-26 17:57:32
我不确定您为选项2列出的任何一个缺点都是严重的,数据导出很容易用一个简单的WHERE子句完成,而且我不担心性能问题。选项2是正确标准化的,在现代关系数据库中,性能应该很好(如果需要,还可以使用适当的索引等进一步调整)。
我只会考虑第一个选择,如果我可以证明它是必要的性能,可伸缩性或其他原因-但必须说,这似乎是不可能的。
https://stackoverflow.com/questions/7906273
复制相似问题