数据库范式

数据库范式     

        第一范式(1NF):每列字段都是原子性的,不可分解;

eg:用户信息表中地址信息        

编号 姓名 年龄 地址
1 张三 30 重庆市xxx区xxx街道xxxx号1-1

针对地址列是不可分割的,但是如果需要省市区信息的时候,就需要针对表设计进行调整。

注:上述地址无法精确地获取到地址中的省市区(用户填写时可能会存在不规范)。

编号 姓名 年龄 省份 城市 区县 详细地址
1 张三 30 重庆市 重庆市 xxx区 xxx号1-1


        第二范式(2NF):非主键字段与全部主键必须全部依赖;

eg:学生信息表

学生编号 课程编号 学生名称 课程名称 所在班级 班主任
1 1 张三 计算机 3班 X老师

 此处设计就可以看出问题,学生编号和课程编号作为主键时,学生名称、所在班级等信息跟课程编号没有关系,不满足全部依赖,对上表进行调整。

注:上述表设计存在的问题是单新增学生时,还未定义课程的时候就会出现新增异常。

学生表

学生编号 学生名称 所在班级 班主任
1 张三 3班 X老师
2 李四 1班 Y老师

课程表

课程编号 课程名称
1 计算机
2 语文

学生课程关系表

学生编号 课程编号
1 1
1 2
2 1

        第三范式(3NF):非主键字段之间不存在间接依赖关系;

eg: 学生信息表

学生编号 学生名称 班级编号 班级名字
1 张三 1 语文1班

此处表设计存在问题是若学生表存在大量数据,这时班级编号1需要改名,就需要将大量的数据进行update操作,不满足非主键字段之间不存在间接依赖关系(班级编号和班级名称存在依赖),如下进行调整。

学生表

学生编号 学生名称 班级编号
1 张三 1

班级表

班级编号 班级名称
1 语文1班

  

        第四范式(4NF):消除多值依赖;

eg: 客户联系方式

客户编号 固定电话 移动电话
1 22-123 131xxxxxxxx
2 11-123 133xxxxxxxx

        此处表设计看似问题不大,当用户存在多个移动电话时,固定电话为空,字段就冗余了,同时不便查询与统计,如下进行调整。        

客户电话表

客户编号 电话号码 电话类型
1 11-123 固定电话
12 131xxxxxxxx 移动电话


        第五范式(5NF):消除传递依赖;

        当多个字段存在相互关系时,如字段A->B->C,这时只有当ABC都为主键时才能确认一条数据,这种情况就不满足条件,可考虑将AB作为一个表,AC作为一个表,BC作为一个表,虽然对表的维护性增强了,但是逻辑更清晰。


        巴斯科德范式:主属性之间不存在部分或传递依赖。

        当非主键字段之间不存在依赖,但是若主键A与字段B存在,A->B->A的传递依赖时则不满足该范式条件。

        具体情况场景如已存在车辆信息表,针对驾驶信息进行填充,若在一张表内则会产生传递依赖,可能会出现大量冗余数据(不同驾驶员驾驶同一个车)。这时就会产生两个表,一个车辆表,一个驾驶信息表。

你可能感兴趣的:(Db,数据库)