数据仓库学习之数据三范式

数据仓库学习之数据三范式

一、3NF知识点

  • 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

  • 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

  • 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

简单来说,就是:
第一范式:具有原子性
第二范式:主键列与非主键列遵循完全函数依赖关系
第三范式:非主键列之间没有传递函数依赖关系

第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于

第一范式:具有原子性
2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分(主要针对联合主键的表);
3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。

二、3范式

通常我们用的最多的就是第一范式(1NF)、第二范式(2NF)、第三范式(3NF),也就是本文要讲的“三大范式”。
一、第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项
学号姓名性别专业
姜率A21韩国大学,法学
姜率B21韩国大学,法学

这里违反了第一范式,调整后的每一列都是不可再分的,改成如下即可

学号姓名性别学校专业
姜率A21韩国大学法学
姜率B21韩国大学法学
二、第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
函数依赖
  • 函数依赖(完全、部分、传递)

    • 函数依赖: A - > B,如果通过A属性(或属性组)的值可以确定唯一B属性的值,则可以成为B依赖于A(-符号是确定关系)。例如:可以通过学号来确定姓名,可以通过学号和课程来确定该课程的分数等等 完全函数依赖: A - > B,如果A是一个属性组,则B属性的确定需要依赖A属性组中的所有属性值。例如:分数的确定需要依赖于学号和课程,而学号和课程可以称为一个属性组。如果有学号没有课程,我们只知道是谁的分数,而不知道是那一学科的分数。如果有课程没有学号,那我们只知道是哪一个学科的分数,而不知道是谁的分数。所以该属性组的两个值是必不可少的。这就是完全函数依赖。
    • 部分函数依赖: A - > B,如果A是一个属性组,则B属性的确定需要依赖A属性组中的部分属性值。例如:如果一个属性组中有两个属性值,它们分别是学号和课程名称。那姓名的确定只依赖这个属性组中的学号,于课程名称无关。简单来说,依赖于属性组的中部分成员即可成为部分函数依赖。
    • 传递函数依赖: A - > B - >C,传递函数依赖就是一个依赖的传递关系。通过确定A来确定B,确定了B之后,也就可以确定C,三者的依赖关系就是C依赖于B,B依赖于A。例如:我们可以通过学号来确定这位学生所在的系部,再通过系部来确定系主任是谁。而这个三者的依赖关系就是一种传递函数依赖。
    • 候选码、主属性码与非属性码
      码: 如果在一张表中,一个属性或属性组,被其他所有属性所完全函数依赖 ,则称这个属性(或属性组)为该表的候选码,简称码。
      然而码又分为主属性码和非属性码。例如:分数的确定没有学号和课程是不行的,所以分数完全函数依赖于课程和学号。
    • 主属性码:
      主属性码也叫主码,即在所有候选码挑选一个做主码,这里相当于是主键。例如:分数完全函数依赖于课程和学号。该码属性组中的值就有课程、学号和分数,所以我们要在三个候选码中,挑选一个做主码,那就可以挑选学号。
    • 非属性码:
      除主码属性组以外的属性,叫做非属性码。例如:在分数完全函数依赖于课程和学号时,其中学号已经让我们选为主码。那么我们就可以确定,除了学号以外的属性值,其他的属性值都是非属性码。也就是说在这个完全函数依赖关系中,课程和分数是非属性码。
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)
订单号产品号产品数量产品价格订单时间订单金额
1001111208.92021-05-23178.0
10022225020.02021-05-231000.0

在上图所示的情况中,同一个订单中可能包含不同的产品,因此主键必须是“订单号”和“产品号”联合组成.

但可以发现,产品数量、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,
这样就不满足第二范式的要求,调整如下,需分成两个表

订单详细表
订单号产品号产品数量产品价格
1001111208.9
10022225020.0
下单表
订单号订单时间订单金额
10012021-05-23178.0
10022021-05-231000.0
三、第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

学生学号姓名专业代课老师ID老师姓名代课课程
1001姜率A法学101徐炳柱法学A
1002姜率A法学102金恩淑法学B

上表中,所有属性都完全依赖于学生学号,所以满足第二范式,但是“老师姓名”和“代课课程”直接依赖的是“代课老师ID”,

而不是主键“学生学号”,所以需做如下调整:

学生信息表
学生学号姓名专业代课老师ID
1001姜率A法学101
1002姜率A法学102
代课信息表
代课老师ID老师姓名代课课程
101徐炳柱法学A
102金恩淑法学B

这样以来,就满足了第三范式的要求。

到此结束

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值