哪个更有效:一个长单表还是分布表?为什么?

时间:2011-12-27 10:17:53

标签: mysql database-design

这个问题与性能有关,如果答案是针对我提供的案例,我将不胜感激。

哪种表现更合适?

  • 创建包含太多字段的表
  • 创建多个表并向其分发类似字段

案例:广泛的网络CMS模块

模式1:很长但只有一个表

cms
-----------------------------------------------
Id
Title
Description
Images
Order
Status
Publish
meta_keywords
meta_description
meta_author

Cleary,大多数像joomla这样的开源CMS使用上述模式。但我认为,这种模式扼杀了RDBMS的精神。我们可以轻松地将特定文章的内容,配置和元素分隔到不同的表格。如下所示

模式2:许多但相关的表

Cms_content         cms_meta        cms_configuration
---------------------------------------------------------------------------
Id                  id              id          
Title               content_id      content_id
Description         keywords        status
Content             description     order
Images              author          publish

注意:此案例中的关系是一对一

要遵循哪种正确的模式?为什么选择一个长而一个表,或者为什么不在单个表上选择分布式表?

2 个答案:

答案 0 :(得分:5)

我能想到的唯一可能导致非规范化数据(一个包含多列的表)的可能原因是:

  • 编写SQL JOIN s
  • 时的懒惰
  • 读取语句可能的性能改进

我喜欢一直使用标准化版本,因为:

  • 我可以确定数据完整性
  • 我可以轻松地从数据库中提取信息(例如,有多少帖子有一些元数据,有多少不同的元数据等)

答案 1 :(得分:2)

我认为'现代'上性能的关键 - 我对“现代”的含义知之甚少,但是 - 基于RDBMS的应用程序不仅取决于数据库模式< /强>

  • 数据库设置:内存使用策略,密钥缓冲区大小,查询缓存大小等
  • 分发数据/处理:分区,网格处理。
  • 缓存策略:使用嵌入式缓存引擎或其他(如memcached)。
  • 硬件性能

因此,估算性能不是一个简单的问题。即使是一个有100个字段的表也可以安装在内存中,但即使是两个字段的表也可能无法安装。 5M行的查询可以在一分钟内完成,但有时相同的查询不会在10M行上结束10分钟(只有两次!) - 这取决于我上面提到的环境。

因此,我认为我们无法为整个案例选择最佳实践。就你的例子而言,关键在于DBA的品味。 (不是开玩笑)