Oracle使用(十)_数据库设计三范式

数据库设计遵守三范式作用:减少数据冗余

第一范式(列不可分,保证列的原子性):如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式
比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,
那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个
部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样
设计才算满足了数据库的第一范式
下表就不符合第一范式:


image.png

比如当我们统计海淀区有多少人时,会发现颗粒度太大,还需要继续处理address数据
地址列可以继续拆分为省,市,区,这样很容易统计

第二范式(确保每列只和主键完全依赖,不能部分依赖):第二范式是在第一范式基础上继续减少数据冗余,把跟主键不是唯一相关数据抽离到新的表
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相
关(主要针对联合主键而言),也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。多种类型意味着可以单独抽取为一张表
下表符合第一范式,但是数据存在冗余
两个河北邯郸数据一样,存了两份,不符合第二范式,同时包含用户类型和地址类型

image.png

下表也不符合第二范式


image.png

数据不存在部分依赖的情况,称为符合第二范式


image.png

总之满足第二范式:就是看冗余的列能不能单独抽出一张表,如果可以那就抽取,直到不能再抽取,那么就符合第二范式

第三范式(不存在传递依赖):要求一个数据库表中不能包含已在其它表中已包含的非主关键字信息(划重点:不包含其他表中的非关键信息)
学生表中包含了班级表中班级编号同时包含班级名称和班级信息,就是出现了传递依赖。
实际上只要包含主关键信息班级编号即可,而把非主关键信息存放在新表中即可

image.png

总结一下:


image.png

表的依赖关系(一张表对应一个实体,说白了就是对象间的关系):
一对一:用户和身份证
一对多:一个人有多双鞋
多对多 : 老师和学生

你可能感兴趣的:(Oracle使用(十)_数据库设计三范式)