具有类似结构的SQL表 - 最佳实践

时间:2011-10-26 17:10:51

标签: sql database performance schema structure

想象一下,我们有一个网站,用户可以阅读文章,查看照片,观看视频等等。每个“项目”都可能被评论,因此我们需要空间来保存那些评论。让我们讨论一下这种情况下的存储可能性。


分布式解决方案

我们显然可以为每个“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_commentsvideo_comments,依此类推。这种方式的优点如下:

  • 我们可以为每个“item”表指定外键,
  • 数据库分为逻辑部分。
  • 导出此类数据没有问题。

缺点:

  • 很多桌子
  • 可能难以维护(添加字段等)

集中解决方案

另一方面,我们可以将所有这些表合并为两个:

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的下降?
  • 在管理和未来可能的迁移方面哪个存储选项会更好(分布式会更好,当然,让我们看看集中式存储选项是不是很远的那个)

1 个答案:

答案 0 :(得分:1)

我不确定您为选项2列出的任何缺点都是严重的,使用简单的WHERE子句可以轻松完成数据导出,我不会担心性能。选项2已正确规范化,在现代关系数据库中,性能应该非常出色(如果需要,可以使用适当的索引等进一步调整)。

如果我能证明它对于性能,可伸缩性或其他原因是必要的,我只会考虑第一个选项 - 但必须说这似乎不太可能。