【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
数据库设计三大范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表, 每一列属性都是不可再分的属性值,确保每一列的原子性,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。
编号 |
姓名 |
性别 |
年龄 |
省份 |
城市 |
详细地址 |
1 |
张三 |
男 |
23 |
北京 |
北京 |
朝阳区新华路23号 |
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
2.第二范式(不能部分依赖)
第二范式是在满足第一范式的基础上,要求每列的属性必须完全依赖于主关键字
学生Id |
姓名 |
身份证号 |
课程Id |
课程名称 |
1 |
张三 |
12345666 |
1 |
数学 |
1 |
张三 |
12345666 |
2 |
语文 |
比如,一个学生学多门课程,如果设计为上面一张表,一个学生就有多条数据,这样子学生信息是重复的,就会造成数据冗余。我们应该拆分成学生信息表,课程信息表以及学生课程关系表,三张表。
学生信息表
学生Id |
姓名 |
身份证号 |
1 |
张三 |
12345666 |
1 |
张三 |
12345666 |
课程信息表
课程Id |
课程名称 |
1 |
数学 |
2 |
语文 |
学生课程关系表
课程Id |
学生Id |
1 |
1 |
2 |
1 |
3.第三范式(不能存在传递依赖)
第三范式是在满足第二范式的基础上,要求数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如设计的学生信息表如下,学校信息和学生Id不是直接相关的。
学生Id |
姓名 |
年龄 |
性别 |
所在学校ID |
学校名称 |
学校地址 |
1 |
张三 |
25 |
女 |
1001 |
北京大学 |
北京市*** |
拆分如下:
学生信息表
学生Id |
姓名 |
年龄 |
性别 |
所在学校ID |
1 |
张三 |
25 |
女 |
1001 |
学校信息表
所在学校ID |
学校名称 |
学校地址 |
1001 |
北京大学 |
北京市*** |
来源:oschina
链接:https://my.oschina.net/u/2725355/blog/667976