您的位置:首页 > 数据库

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

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

学号姓名emailqq
20181018张三xxxx@.xxx.cnxxxxx
20181019李四xxxx@.xxx.cnxxxxx

范式二 2NF

书中描述

需要满足以下要求:

1.满足范式一(1NF)

2.要求该数据表中的所有非主键字段都依赖于该数据表中的主键字段

反例 (以选修课程情况表为例,设学号为主键)

表2

学号姓名年龄课程名称成绩学分
20181018张三19数据库设计802
20181019李四18机器学习902
存在问题

1.数据冗余

以下表为例:

表2.1

学号姓名年龄课程名称成绩学分
20181018张三19数据库设计802
20181018张三19英语1002
20181019李四18机器学习902
20181019李四18英语852
可以看见表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张三80002000
20181019李四1500375
存在问题

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

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

改正思路

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

正例

表3.1

员工编号姓名部门
20181018张三开发部
20181019李四卫生部
表3.2 部门标准工资表

部门工资奖金计算方式
开发部800025%
卫生部150025%
员工编号部门领取工资领取奖金
20181018开发部30001500
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库