数据库学习(一) 数据库范式
2018-03-02 18:52
113 查看
数据库学习(一) 数据库范式
范式一 1NF
书中描述要求每一个数据项都不能被拆分成两个或两个以上的数据项
反例 (以学生基本信息表为例)
表1
学号 | 姓名 | 联系方式 |
---|---|---|
20181018 | 张三 | xxxx@.xxx.cn , qq xxxxx |
20181019 | 李四 | xxxx@.xxx.cn , qq xxxxx |
这个原因书里并未给出,但是可以明确看出当我只想要张三的email时,数据库还会把他的qq一股脑给我。
改正思路
表1把qq字段和email字段分离即可。==见表1.1==
正例
表1.1
学号 | 姓名 | ||
---|---|---|---|
20181018 | 张三 | xxxx@.xxx.cn | xxxxx |
20181019 | 李四 | xxxx@.xxx.cn | xxxxx |
范式二 2NF
书中描述需要满足以下要求:
1.满足范式一(1NF)
2.要求该数据表中的所有非主键字段都依赖于该数据表中的主键字段
反例 (以选修课程情况表为例,设学号为主键)
表2
学号 | 姓名 | 年龄 | 课程名称 | 成绩 | 学分 |
---|---|---|---|---|---|
20181018 | 张三 | 19 | 数据库设计 | 80 | 2 |
20181019 | 李四 | 18 | 机器学习 | 90 | 2 |
1.数据冗余
以下表为例:
表2.1
学号 | 姓名 | 年龄 | 课程名称 | 成绩 | 学分 |
---|---|---|---|---|---|
20181018 | 张三 | 19 | 数据库设计 | 80 | 2 |
20181018 | 张三 | 19 | 英语 | 100 | 2 |
20181019 | 李四 | 18 | 机器学习 | 90 | 2 |
20181019 | 李四 | 18 | 英语 | 85 | 2 |
由此可得出==数据冗余==即为单一数据表中字段内数据重复。
2.更新异常
根据表2.1中的数据来看,当英语这门课程的学分在下个学期要改成3分时,我们需要修改两条数据,可学校里人数众多,肯定不止张三和李四两个学生,这时如果漏改一条或多条数据,都会造成同一门课程却出现两种学分的请况。
3.插入异常
若此时学校想新开设一门程序设计课程时,由于还没有学生学择这门课程,就连课程的学分和课程名称都无法录入表中。
4.删除异常
若此时一批学生毕业离校,在删除学生数据的同时连带课程与学分也会同时删除。即为删除异常。
改正思路
根据范式二的要求并结合表2.1中出现的问题,即可把表2.1拆分为以下三个表:
表2.2 学生信息表
表2.3 学生成绩表
表2.4 选修课程信息表
见下方正例
正例
表2.2
学号 | 姓名 | 年龄 |
---|---|---|
20181018 | 张三 | 18 |
20181019 | 李四 | 19 |
学号 | 课程名称 | 成绩 |
---|---|---|
20181018 | 数据库设计 | 80 |
20181019 | 机器学习 | 90 |
课程名称 | 学分 |
---|---|
数据库设计 | 2 |
机器学习 | 2 |
英语 | 2 |
范式三 3NF
书中描述需要满足以下要求:
1.满足范式一(1NF)
2.满足范式二(2NF)
3.要求该数据表中任何两个非主键字段间都不存在函数关系
反例 (以员工基本信息表为例)
表3
员工编号 | 姓名 | 工资 | 奖金 |
---|---|---|---|
20181018 | 张三 | 8000 | 2000 |
20181019 | 李四 | 1500 | 375 |
首先表3明显满足范式一和范式二的要求,但是仔细看就能发现字段奖金的数值是员工工资的25%,若有一天员工奖金变成工资的30%时,即会发生范式二所存在的问题。
而且员工的工资和奖金会出现许多不可预知的变动所以大致可以区分为,部门的标准工资,和员工实际领取的工资
改正思路
拆分员工基本信息表,并添加工资领取日志
正例
表3.1
员工编号 | 姓名 | 部门 |
---|---|---|
20181018 | 张三 | 开发部 |
20181019 | 李四 | 卫生部 |
部门 | 工资 | 奖金计算方式 |
---|---|---|
开发部 | 8000 | 25% |
卫生部 | 1500 | 25% |
员工编号 | 部门 | 领取工资 | 领取奖金 |
---|---|---|---|
20181018 | 开发部 | 3000 | 1500 |