范式与反范式

Schema 设计

太多的列

MySQL 存储 API 引擎在工作的时候需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码为各个列。但是这个过程代价是比较昂贵的,列越多代价就越大。MyISAM 的定长行结构实际上与服务器层的行结构刚好匹配,所以不需要转换;但是 MyISAM 的边长行结构与 InnoDB 的行结构总是需要转换。

太多的关联

关联太多会导致查询性能和并发性降低

枚举

使用数据库枚举导致设计凌乱,而且枚举变化时需要执行 ALTER TABLE 这对于业务应用影响较大,尽量在上层应用中实现枚举。

合理使用 NULL 值

使用 NULL 值会使列的索引和索引统计难度增加,但是也不要完全摒弃。在特殊场景中合理使用避免自定特殊值导致应用出现其他问题。

范式化

优点

  • 更新操作比反范式化要更快
  • 当数据很好的范式化时,就是有很少或者没有重复数据
  • 范式化的表会更小
  • 减少数据检索的难度,可以不使用 DISTINCT 或者 GROUP BY

缺点

  • 设计上需要关联

反范式化

会造成数据冗余但是没有关联是的查询会更高效。

混用范式化与反范式化

可以具体分析业务数据,将两者结合起来使用。