数据库学习(一) 数据库范式

数据库学习(一) 数据库范式

范式一 1NF

书中描述

要求每一个数据项都不能被拆分成两个或两个以上的数据项

反例 (以学生基本信息表为例)

表1

学号 姓名 联系方式
20181018 张三 [email protected] , qq xxxxx
20181019 李四 [email protected] , qq xxxxx

存在问题

这个原因书里并未给出,但是可以明确看出当我只想要张三的email时,数据库还会把他的qq一股脑给我。

改正思路

表1把qq字段和email字段分离即可。==见表1.1==

正例

表1.1

学号 姓名 email qq
20181018 张三 [email protected] xxxxx
20181019 李四 [email protected] 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.1中的重复数据的字段为: ==学号== 、==姓名== 、==年龄== 、==课程名称== 、==学分==。

由此可得出==数据冗余==即为单一数据表中字段内数据重复。

2.更新异常

根据表2.1中的数据来看,当英语这门课程的学分在下个学期要改成3分时,我们需要修改两条数据,可学校里人数众多,肯定不止张三和李四两个学生,这时如果漏改一条或多条数据,都会造成同一门课程却出现两种学分的请况。

3.插入异常

若此时学校想新开设一门程序设计课程时,由于还没有学生学择这门课程,就连课程的学分和课程名称都无法录入表中。

4.删除异常

若此时一批学生毕业离校,在删除学生数据的同时连带课程与学分也会同时删除。即为删除异常。

改正思路

根据范式二的要求并结合表2.1中出现的问题,即可把表2.1拆分为以下三个表:

表2.2 学生信息表

表2.3 学生成绩表

表2.4 选修课程信息表

见下方正例

正例

表2.2

学号 姓名 年龄
20181018 张三 18
20181019 李四 19

表2.3

学号 课程名称 成绩
20181018 数据库设计 80
20181019 机器学习 90

表2.4

课程名称 学分
数据库设计 2
机器学习 2
英语 2

范式三 3NF

书中描述

需要满足以下要求:

1.满足范式一(1NF)

2.满足范式二(2NF)

3.要求该数据表中任何两个非主键字段间都不存在函数关系

反例 (以员工基本信息表为例)

表3

员工编号 姓名 工资 奖金
20181018 张三 8000 2000
20181019 李四 1500 375

存在问题

首先表3明显满足范式一和范式二的要求,但是仔细看就能发现字段奖金的数值是员工工资的25%,若有一天员工奖金变成工资的30%时,即会发生范式二所存在的问题。

而且员工的工资和奖金会出现许多不可预知的变动所以大致可以区分为,部门的标准工资,和员工实际领取的工资

改正思路

拆分员工基本信息表,并添加工资领取日志

正例

表3.1

员工编号 姓名 部门
20181018 张三 开发部
20181019 李四 卫生部

表3.2 部门标准工资表

部门 工资 奖金计算方式
开发部 8000 25%
卫生部 1500 25%
员工编号 部门 领取工资 领取奖金
20181018 开发部 3000 1500

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