第一范式(1NF)
◇ 每一列必须仅包含一个值(也称作列值的原子性或不可再分割性)。比如存储用户地址,一列不能同时存国家、省、市、街道等信息。
◇ 所有表都不能具有相关数据的重复列。比如商品图片,不能图片1用一列,图片2用一列,图片3用一列......,如果一个表有重复的相似列,就采用关系模型(一对一,一对多)把这些列转化成单独的表。
第一范式就是横向分析表,确保横向列值的唯一性并避免重复出现类似的数据。
第二范式(2NF)
◇ 某一列在多行中不能有重复的非主键值,重复的非主键值必定是另一张表的主键值。这里比较有疑惑的就是时间字段,其实MySQL对日期支持的非常好,还有就是在同一秒内出现完全相同的操作概率是极低的。
◇ 表中每一个非主键都依赖于表的主键。
第二范式就是纵向分析表,确保纵向列值不含重复的非主键值。查看表之间的关系,如果出现多对多的关系时,就要拆表再新建关联表,一个表的主键通常是另一个表的外键。
第三范式(3NF)
◇ 表中的单列是独立的,也就是修改某一列的值不需要修改另一列的值,不能存在一列是另一列的子集,比如a->b->c,c是b中的属性,那么bc就不能同时出现在一张表中。但列与列之间又是相互依赖的。
数据库设计允许有个人的爱好和诠释,但最重要的要求是不要明显地违反范式,任何违反范式的设计都会在将来出现一些问题。规范化就是在数据完整性与可扩展性,简单与快速之间进行权衡,实践和经验将会让我们掌握最佳的数据建模方式,并尽可能地遵守范式。