数据库的三范式, 也学了几次了, 但容易忘记。
为此以自己的理解,简略记之。
1.第一范式:数据库的字段是单一属性,不可再分 (原子性)
Example: B2C中常见的客户信息地址表:
客户Id, 客户地址
这样就违反了。为啥?因为客户地址可以再细分的—— 省、市、区域、街道(详细地址);
除了最后一级的详细地址,前面几级都是可以提取出来作为字段的。这样做的好处就是避免了数据的冗余——省、市、区域都有现成的,数据库只需要保存你的详细地址而已。
最终设计:客户Id, 省id, 市id, 区域id, 详细地址
当然,这个“不可再分”也是根据需要来,而不是硬性的。比如在数据较少的情况下地址细分就过度设计了……
2.第二范式:任何非关键字段不能部分依赖任一侯选关键字(即必须完全依赖)——要求:存在主键。——针对情况:复合主键;
Example: 学生成绩表
学号, 课程号, 姓名, 性别, 分数
这里的复合主键就是: 学号, 课程号。姓名、性别只与学号有关,与课程号无关,而只有分数与两者有关。
最终设计: 学号、课程号、分数。
3.第三范式:任何非关键字段不能传递依赖任一侯选关键字——针对情况:存在外键的情况下。
Example: 学生信息表
学号, 姓名, 系号, 系名
就存在这样一个传递依赖关系:学号<-系号<-系名。
系名与学号有关系,但不是直接关系。这种情况下,把系名去掉即可。
最终设计:学号, 姓名, 系号