范式:其实是一种规则,就是设计表的时候需要遵循一定的规则。
第一范式:字段值的原子性,所有字段都是不可分割的原子值。
id | name-age |
---|---|
1 | bruce-25 |
如name-age还可以分为name和age
id | name | age |
---|---|---|
1 | bruce | 25 |
第二范式:第一范式前提下,所有非主属性不能部分依赖主属性。
id | course_id | name | course_name |
---|---|---|---|
1 | 01 | bruce | math |
id和course_id是主键
name依赖于id,course_name依赖于course_id并不完全依赖于所有主键。
id | name | course_id | course_name |
---|---|---|---|
1 | bruce | 01 | math |
id是主键,课程名依赖于courseId,不直接依赖id。
第三范式:第二范式前提下,所有非主属性需要直接依赖于主属性,不能传递依赖。
总结下来,范式的好处是,能够减少数据冗余,表的更新操作更快,每个表都会比较小。但是也存在一定的问题,遵循三范式设计的表,在关联查询操作时比较繁琐,更难进行索引优化;所以就有了反范式,就是不完全按照三范式来设计表,这样的做法可以减少在关联查询时候,减少表与表之间的关联,更好的进行索引优化;当然反范式有好处肯定有坏处,这样设计的表存在数据冗余以及会出现数据维护异常,对数据修改也需要更大成本。