数据库设计中,需要遵循一定的规则才能避免数据的冗余,这些规则实际上限制的是表与表、表与属性之间的关系。这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
第一范式
第一范式(1NF)是指数据表中的每个字段必须是不可拆分的最小单元,也就是确保每一列的原子性。
举个栗子,某省的投档线公布表:
院校代码 | 科类 | 院校名称 | 投档分 |
---|---|---|---|
0019 | 理工 | 吉林大学 | 538.106123198 |
1000 | 理工 | 北京大学医学部 | 657.141142258 |
1001 | 文史 | 北京大学 | 633.127139227 |
很明显,这个投档线字段包括了总分、数学语文和英语,这个字段可以拆分为另外四个字段,所以这种设计不遵循第一范式。
第二范式
第二范式(2NF)是指满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情。
这个是什么意思呢,意思就是说,表中除了主键的其他列,不能和主键没有关系,但其实这句话又有点相互矛盾,既然没关系,又怎么会放在同一列中呢,其实可以这样想,单独把这一列和主键拿出来,如果他们之间没有关系,那肯定是不满足第二范式的。
举个栗子:
学号 | 课程号 | 分数 | 学分 |
---|---|---|---|
12 | 0001 | 50 | 5 |
13 | 0002 | 60 | 3 |
14 | 0003 | 70 | 2 |
这是一张成绩表,包括学号、课程号、成绩和学分,主键为学号,但是单独将学分和学号拿出来,两个没有关系,所以不满足第二范式。
第三范式
第三范式(3NF)是指必须先满足第二范式(2NF),另外要求表中的每一列只与主键直接相关而不是间接相关。
这个又是什么意思呢,似乎和第二范式的描述差不多啊,其实不然,还是有细微差别的,第三范式保证了表中的字段消除了传递依赖,比如C依赖于B,B依赖于A,那么C依赖于A,像这样的情况不能让A、B、C出现在同一个表中。
举个栗子:
学号 | 学院号 | 学院地点 |
---|---|---|
05 | 01 | 01楼 |
06 | 01 | 01楼 |
07 | 02 | 02楼 |
可以看出,学院地点与学号不是直接相关连,学院地点和学院号直接相关连,所以不满足数据库第三范式。有些东西只可意会不可言传,不需要完全区分第二范式和第三范式的区别,只要能在实际运用中知道,这个表设计到底符不符合数据库规范就可以了。
版权声明:本文为xdzhouxin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。