大数据:数据仓库 3NF 范式理论

参考:数据仓库3NF基础理论和实例    博主:张子良

 参考:数据库三范式                           博主:五月的仓颉 

 

我都不知道自己在说什么

一、1NF-无重复的列

  • 数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
    1. 一个属性列,每条记录中不能有多个值 / 字段;(表的每一列中,只能记录一个数值 / 字段)
    2. 不能有相同的属性;(表中不能有两个相同的列)
  • 如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
  • 说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

 

 

二、2NF-部分依赖

  • 非主属性完全依赖于主键(消除非主属性对主码的部分函数依赖);
  • 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF);
  • 第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识;(例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码。)
  • 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主键的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是属性完全依赖于主键;

 

 

三、3NF-传递依赖

  • 属性不依赖于其它非主属性(消除传递依赖);
  • 满足第三范式(3NF)必须先满足第二范式(2NF);
  • 第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息(数据表中不存在非关键字段对任一候选关键字段的传递函数依赖)。(例:关键字a → 非关键字A → 非关键字B → 非关键字C,其中不能存在类似:关键字a → 非关键字B,这种传递依赖,2NF 中不考虑此情况

 

 

四、实例一

  • 以一个学校的学生系统为例分析说明,这几个范式的应用。首先第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
  • 首先确定一下要设计的内容包括那些:学号、学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话。
  • 我们对于这些信息,说关心的问题有如下几个方面:
  1. 学生有那些基本信息
  2. 学生选了那些课,成绩是什么
  3. 每个课的学分是多少
  4. 学生属于那个系,系的基本信息是什么

 

1、第二范式(2NF)实例分析

  • 首先我们考虑,把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、学科成绩、系别、系办地址、系办电话)下面存在如下的依赖关系:
  1. (学号)→ (姓名、年龄、性别、课程、课程学分、学科成绩)
  2. (学号) → (所在学院)→(学院地点,、学院电话)

 

  问题:

  • 数据冗余
  1. 同一门课程由 n 个学生选修,"课程学分“ 就重复 n-1 次;
  2. 同一个学生选修了 m 门课程,姓名和年龄就重复了 m-1 次;
  • 更新异常
  1. 若调整了某门课程的学分,数据表中所有行的 "学分" 值都要更新,否则会出现同一门课程学分不同的情况;
  2. 假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库;
  • 删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常;

 

  • 解决方案

  • 把选课关系表 SelectCourse 改为如下三个表:
  1. 学生:Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话);
  2. 课程:Course(课程名称, 学分);
  3. 选课关系:SelectCourse(学号, 课程名称, 成绩);

 

2、第三范式(3NF)实例分析

  • 接着看上面的学生表Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系:

  (学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话)

 

  • 但是还存在下面的决定关系:(学号) → (所在学院)→(学院地点, 学院电话),即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
  1. 它也会存在数据冗余、更新异常、插入异常、删除异常的情况。 (数据的更新,删除异常这里就不分析了,可以参照2.1.1进行分析)

 

  • 根据第三范式把学生关系表分为如下两个表就可以满足第三范式了:
  1. 学生:(学号, 姓名, 年龄, 性别,系别);
  2. 系别:(系别, 系办地址、系办电话);

 

 

五、实例二

  • 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
  • 所谓传递函数依赖:指的是如果存在 "A → B → C" 的决定关系,则 C 传递函数依赖于 A。
  • 满足第三范式的数据库表应该不存在如下依赖关系:关键字段 → 非关键字段x → 非关键字段y,而又有:关键字段 → 非关键字段 y;


  

  • 假定学生关系表为 Student ( 学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话 ) ,关键字为单一关键字"学号",因为存在如下决定关系:(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话),这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:(学号) → (所在学院) → (学院地点, 学院电话),即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。 

 

  • 把学生关系表分为如下两个表:
  1. 学生:(学号, 姓名, 年龄, 所在学院);
  1. 学院:(学院, 地点, 电话)。
  • 这样的数据库表是符合第三范式的;

 

posted @ 2020-09-01 15:48  何永灿  阅读(923)  评论(0编辑  收藏  举报