众所周知Mysql数据库有建表的三大范式,分别是:
1、第一范式:保证列具有原子性,一张表中的每一个字段,都应不可再分,例如:总金额=单价×数量,此时这个总金额就可以分成单价和数量两字段。
2、第二范式:属性完全依赖于主键,也就是表中除了主键以外的其他字段都必须依赖主键。
3、第三范式属性不依赖于其它非主属性,也就是除了主键以外的其他字段应没有任何关系。
在范式化的数据库中,每个数据会出现并且只出现一次。与之相反,在反范式化的数据库中,信息是冗余的,可能会存储在多个地方。
一般来说,现在的公司建表大多数都是要根据三大范式来创建的,尤其是写操作密集的业务场景。在写操作进行比较多的时候范式化能够带来好处有:
范式化的优缺点
1.范式化的更新操作通常比反范式化要快。
2.当数据较好地范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据。
3.范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快。
1.范式化后的表很少有多余的数据,这意味着检索列表数据时使用去重(DISTINCT)或者分组(GROUP BY)语句的次数会更少。
范式化设计的缺点是查询语句通常需要关联。稍微复杂一些的查询语句在符合范式的schema上都可能需要至少一次关联(比如上面的总价、单价、和数量,根据范式吧总价分成金额和树数量,但是每次想要获得总价就得用单价×数量来获得),也许更多。这不但代价昂贵,也可能使一些索引策略无效。
反范式化的优缺点
反范式化的表因为所有数据都在一张表中,可以很好地避免关联查询。
如果不需要关联表,则对大部分查询最差的情况,即使表没有使用索引,是全表扫描。当数据比内存大时这可能比关联要快得多,因为这样避免了随机IO(全表扫描基本是顺序IO,但也有不是的,主要看存储引擎是如何实现的)。
但是,正如上面所说,反范式是将数据进行冗余,以此来提升查询的效率,但是数据冗余首先会造成一张表所占空间变大,其次对于表进行除查询以外的操作所需要的开销会变得更大。
总结
我个人对此的理解是,建表并不是必须要按照三范式来设计的,好的数据库设计一定不是一成不变按图索骥的,而是根据实际的业务情况来进行对应的灵活处理。例如:在查询请求非常多,其他的删除,修改,插入情况很少的时候,也是可以使用反范式来进行优化的。