数据库设计三大范式:
① 第一范式:列具有原子性,列不可再分
② 第二范式:非主键列都依赖于主键
③ 第三范式:非主键列都直接依赖主键,不存在传递依赖。即不能存在:非主键列A依赖于非主键B,非主键B依赖于主键的情况
反范式:违反范式规则的数据库设计理念
范式的优点和缺点:
优点:
① 范式化的更新操作通常比反范式化要快
② 当数据较好的范式化时,就只有很少或没有重复数据,所以只需要修改更少的数据
③ 范式化的表通常更小,可以更好的存放在内存中,所以执行操作会更快
③ 很少有多余的数据意味着检索列表数据时更少需要distinct或者group by语句
缺点:
① 通常表需要关联,稍微复杂一些的查询语句在符合范式的表上都可能需要至少一次的关联,可能会更多。这不但代价昂贵,也可能是一些索引策略无效。
② 在执行数据库语句时,使得需要在一个索引中又排序又过滤
反范式的优点和缺点:
优点:
① 反范式化的表因为所有的数据都在一张表中,可以很好的避免关联
② 对大部分查询最差的情况,即使表没有使用到索引(全表扫描),当数据比内存大时这可能比关联要快得多,因为这样避免了随机I/O(全表扫描大部分情况下是顺序I/O)。
缺点:
① 表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失。
混用范式化和反范式化
① 完全范式和完全反范式在实际的开发中几乎不存在。
② 最常见的反范式化数据的方法是复制或者缓存,在不同的表中存储相同的特定列。在MySQL5.0和更新版中,可以使用触发器更新缓存值,这使得实现这样的方案变得更简单。(不推荐使用触发器,难以维护)
③ 考虑高效排序,需要从父表冗余一些数据到子表
④ 缓存衍生值也是有用的;就是说对于一些数量统计显示,可以单独设定一个子查询来计算并显示,或者在主表中建立一个统计字段保存和更新这个值
缓存表和汇总表
有时候提升性能最好的办法就是在同一张表中保存衍生的冗余数据;然而,有时可能需要创建一张完全独立的汇总表或缓存表