数据库范式
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
数据库范式
第一范式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的传递依赖时则不满足该范式条件。
具体情况场景如已存在车辆信息表针对驾驶信息进行填充若在一张表内则会产生传递依赖可能会出现大量冗余数据不同驾驶员驾驶同一个车。这时就会产生两个表一个车辆表一个驾驶信息表。