数据库三范式
第一范式:任何一张表都应该有自己的主键,并且每一个字段的原子性都是不可再分的。
比如一张学生表,其中有个字段是联系方式,不能说联系方式里包括了电话和微信,必须拆分成两个字段
第二范式:在第一范式的基础上,要求所有的非主键字段完全依赖主键,不能产生部分依赖。
比如有一张表,包含如下几个字段sid(学号),cid(课程号),score(成绩), course(课程),其中sid和cid组成联合主键
sid | cid | score | course |
---|
score依赖于学生学号和课程号,符合第二范式,而course只依赖于课程号,故course不是完全依赖于主键,不符合第二范式,
我们应该将表拆分成两张表
sid | cid | score |
---|
cid | course |
---|
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键,消除传递依赖。
id | name | sex_code | sex_desc | phone |
---|---|---|---|---|
001 | 小王 | 0 | 男 | 11515616514 |
002 | 小李 | 0 | 男 | 18454655567 |
003 | 小张 | 1 | 女 | 18515156156 |
表中sex_desc依赖于sex_code,而sex_code依赖于id(主键),从而推出sex_desc依赖于id(主键),sex_desc不直接依赖于主键,而是通过依赖于非主键列而依赖于主键,属于传递依赖,不符合3NF。不能说B依赖A,C依赖B,就推出C依赖A;应该把他们拆分成两张表:
id | name | sex_code | phone |
---|---|---|---|
001 | 小王 | 0 | 15841555155 |
002 | 小李 | 0 | 15454514541 |
003 | 小张 | 1 | 15644655151 |
sex_code | sex_desc |
---|---|
0 | 男 |
1 | 女 |