数据库系统概论——函数依赖、码和范式(1NF、2NF、3NF、BCNF)详解

简介: 关系模式由五部分组成,即它是一个五元组:R(U,D,DOM,F)R(U, D, DOM, F)R(U,D,DOM,F)关系模式R(U,D,DOM,F)R(U, D, DOM, F)R(U,D,DOM,F)中,DDD和DOMDOMDOM与逻辑结构设计关系不大,因此,将关系模式简化为一个三元组:当且仅当UUU上的一个关系rrr 满足FFF时,rrr称为关系模式R(U,F)R(U, F)R(U,F)的一个。设R(U)R(U)R(U)是一个属性集UUU上的关系模式,XXX和YYY是UUU的子集。若对于R(U)R(

@[TOC]

概念回顾

关系模式由五部分组成,即它是一个五元组:
$R(U, D, DOM, F)$

  • $R:$ 关系名
  • $U:$ 组成该关系的属性名集合
  • $D:$ 属性组U中属性所来自的域
  • $DOM:$ 属性向域的映象集合
  • $F:$ 属性间数据的依赖关系集合

关系模式$R(U, D, DOM, F)$中,$D$和$DOM$与逻辑结构设计关系不大,因此,将关系模式简化为一个三元组:

  • $R(U, F)$

当且仅当$U$上的一个关系$r$ 满足$F$时,$r$称为关系模式$R(U, F)$的一个关系

1、函数依赖的定义

在这里插入图片描述

设$R(U)$是一个属性集$U$上的关系模式,$X$和$Y$是$U$的子集。

若对于$R(U)$的任意一个可能的关系$r$,$r$中不可能存在两个元组在$X$上的属性值相等, 而在$Y$上的属性值不等, 则称 “$X$函数确定$Y$” 或 “$Y$函数依赖于$X$”,记作$X→Y$。

函数依赖说明:

  1. 所有关系实例均要满足
  2. 语义范畴的概念
  3. 数据库设计者可以对现实世界作强制的规定

1.1 平凡函数依赖和非平凡函数依赖

定义:
在关系模式$R(U)$中,对于$U$的子集$X$和$Y$。

  • 如果X→Y,但$Y \not\subseteq X$则称X→Y是非平凡的函数依赖
  • 若X→Y,但$Y \subseteq X$, 则称X→Y是平凡的函数依赖

举例说明:
在关系SC(Sno, Cno, Grade)中

非平凡函数依赖

  • (Sno, Cno)——>Grade

平凡函数依赖

  • (Sno,Cno)——>Sno
  • (Sno,Cno)——>Cno

若$X→Y$,则$X$称为这个函数依赖的决定属性组,也称为决定因素(Determinant)。
若$X→Y,Y→X,$则记作$X←→Y$。
若$Y$不函数依赖于$X$,则记作$X \not\rightarrow Y$。

1.2 完全函数依赖和部分函数依赖

定义:
在$R(U)$中,如果$X→Y$,并且对于$X$的任何一个真子集$X^{'}$,都有$X^{'} \not\rightarrow Y$,则称$Y对X$完全函数依赖,记作$X \overset F \rightarrow Y$

若$X→Y$,但$Y$不完全函数依赖于$X$,则称$Y$对$X$部分函数依赖,记作$X \overset P \rightarrow Y$。

举例说明一下:

$(Sno,Cno) \overset F \rightarrow Grade$是完全函数依赖;
$(Sno,Cno)→Sdept$是部分函数依赖

因为在完全函数依赖中,任何一个真子集(Sno或者Cno)都不能单独地决定Grade,也就是$Sno \not\rightarrow Grade$和$Cno \not\rightarrow Grade$。
而在部分函数依赖中,任何一个真子集(Sno或者Cno)都可以单独地决定Sdept,也就是$Sno \rightarrow Sdept$和$Cno \rightarrow Sdept$。

1.3 传递函数依赖

定义:
在R(U)中,如果$X→Y,(Y \not\subseteq X) ,Y \not\rightarrow X, Y→Z$, 则称$Z$对$X$传递函数依赖。 记作:$X→Z$。

注:
如果Y→X,即X←→Y,则Z直接依赖于X,非传递依赖。

例: 在关系Std(Sno, Sdept, Mname)中(属性组分别为学号、系别、系主任名字),有:

  • Sno → Sdept,Sdept → Mname
  • Mname传递函数依赖于Sno

记作: Sno → Mname

2、码

在讲解码的概念之前,首先阐明一点,码即是键,键即是码,意思就是我们平时学习数据库进行表操作的时候,遇见的主键和外键就是主码和外码的意思,两者是同一概念,不要弄混。先给一个图大致理解下:
在这里插入图片描述

2.1 主码和候选码

定义:
设$K$为$R<U,F>$中的属性或属性组合。若$K \overset F \rightarrow U$,则$K$称为$R$的侯选码(Candidate Key)。

若候选码多于一个,则选定其中的一个做为主码(Primary Key)。

2.1主属性与非主属性

  • 包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)。
  • 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)

2.2 全码

整个属性组$U$是码,称为全码(All-key)。

即当所有的属性共同构成一个候选码时,这时该候选码为全码。举例在关系模式R(教师,课程,学生)中,假如一个教师可以讲授多门课程,某门课程可以有多个教师讲授,学生可以听不同教师讲授的不同课程,那么,要区分关系中的每一个元组,这个关系模式R的候选码应为全部属性构成 (教师、课程、学生),即主码。

举例说明一下:
关系模式$S(\underline{Sno},Sdept,Sage)$,

  • 单个属性Sno是码,

$SC(\underline{Sno,Cno},Grade)$中,

  • (Sno,Cno)是码

关系模式$R(P,W,A)$
$P:$演奏者 $W:$作品 $A:$听众

  • 一个演奏者可以演奏多个作品
  • 某一作品可被多个演奏者演奏
  • 听众可以欣赏不同演奏者的不同作品

此关系模式的码为(P,W,A),即全码(All-Key)

2.3 外部码

定义:
关系模式$R$ 中属性或属性组$X$ 并非$R$的码,但 $X$ 是另一个关系模式$S$的码,则称 $X$ 是$R$ 的外部码(Foreign key),简称外码。

举例:
如在$SC(\underline{Sno,Cno},Grade)$中,$Sno$不是码,但$Sno$是关系模式$S(\underline{Sno},Sdept,Sage)$的码,则$Sno$是关系模式$SC$的外部码。

3、范式

范式是符合某一种级别的关系模式的集合,在关系数据库中的关系必须满足一定的要求,而满足不同程度要求的关系为不同类型的范式

范式的种类:

  • $第一范式(1NF)$
  • $第二范式(2NF)$
  • $第三范式(3NF)$
  • $BC范式(BCNF)$
  • $第四范式(4NF)$
  • $第五范式(5NF)$

各种范式之间存在联系:
在这里插入图片描述

某一关系模式$R$为第$n$范式,可简记为$R∈nNF$。
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化 。

3.1 第一范式(1NF)

定义:
如果一个关系模式$R$的所有属性都是不可分基本数据项,则$R∈1NF$。

第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。

但是满足第一范式的关系模式并不一定是一个好的关系模式

举例:
[例] 关系模式 $S-L-C(Sno, Sdept, Sloc, Cno, Grade)$

  • $Sloc$为学生住处,假设每个系的学生住在同一个地方

函数依赖包括

  • $(Sno, Cno) \overset F \rightarrow Grade$
  • $Sno → Sdept$
  • $(Sno, Cno) \overset P \rightarrow Sdept$
  • $Sno → Sloc$
  • $(Sno, Cno) \overset P \rightarrow Sloc$
  • $Sdept → Sloc$

$S-L-C$的码为$(Sno, Cno)$

$S-L-C$满足第一范式。

非主属性Sdept和Sloc部分函数依赖于码(Sno, Cno)

分解前的关系模式$S-L-C$
在这里插入图片描述
但是$S-L-C$不是一个好的关系模式,会产生以下问题:

  • (1) 插入异常
  • (2) 删除异常
  • (3) 数据冗余度大
  • (4) 修改复杂

原因:==Sdept、 Sloc部分函数依赖于码。==

解决方法:

  • $S-L-C$分解为两个关系模式,以消除这些部分函数依赖

    • $SC(Sno, Cno, Grade)$
    • $S-L(Sno, Sdept, Sloc)$
  • 关系模式$SC$的码为$(Sno,Cno)$
  • 关系模式$S-L$的码为$Sno$
  • 这样非主属性对码都是完全函数依赖

在这里插入图片描述

3.2 第二范式(2NF)

定义:
若$R∈1NF$,且每一个非主属性完全函数依赖于码,则$R∈2NF$。

例:

  • $S-L-C(Sno, Sdept, Sloc, Cno, Grade) ∈1NF$
  • $S-L-C(Sno, Sdept, Sloc, Cno, Grade) 分解为2NF:$

    • $SC(Sno, Cno, Grade) ∈ 2NF$
    • $S-L(Sno, Sdept, Sloc) ∈ 2NF$

采用投影分解法将一个$1NF$的关系分解为多个$2NF$的关系,可以在一定程度上减轻原$1NF$关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

但将一个$1NF$关系分解为多个$2NF$的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。

3.3 第三范式(3NF)

定义:

  • 关系模式$R<U,F>$中若不存在这样的码$X$、属性组$Y$及非主属性$Z(Z \not\subseteq Y)$, 使得$X→Y,Y→Z$成立,$Y → X$,则称$R<U,F> ∈ 3NF$。
  • 若$R∈3NF$,则每一个非主属性既不部分依赖于码也不传递依赖于码

例:$2NF$关系模式$S-L(Sno, Sdept, Sloc)$中的函数依赖关系:

  • $Sno→Sdept$
  • $Sdept \not\rightarrow Sno$
  • $Sdept→Sloc$

可得:
$Sno \overset {传递} \rightarrow Sloc$,即$S-L$中存在非主属性对码的传递函数依赖,$S-L \not\in 3NF$

函数依赖图:

在这里插入图片描述
解决方法:
采用==投影分解法==,把$S-L$分解为两个关系模式,以消除传递函数依赖:

  • $S-D(Sno, Sdept)$
  • $D-L(Sdept,Sloc)$
  • $S-D$的码为$Sno$,$D-L$的码为$Sdept$。

分解后的关系模式$S-D$与$D-L$中不再存在传递依赖

采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

将一个2NF关系分解为多个3NF的关系后,仍然不能完全消除关系模式中的各种异常情况和数据冗余。

3.4 BC范式(BCNF)

定义:
关系模式$R<U,F>∈1NF$,若$X \not\rightarrow Y$且$Y \subseteq X$时$X$必含有码,则$R<U,F> ∈BCNF$。
等价于:每一个决定属性因素都包含码

若R∈BCNF

  • 所有非主属性对每一个码都是完全函数依赖
  • 所有的主属性对每一个不包含它的码,也是完全函数依赖
  • 没有任何属性完全函数依赖于非码的任何一组属性

在这里插入图片描述
如果R∈3NF,且R只有一个候选码
在这里插入图片描述

注意:如果一个关系模式$R$属于$BCNF$,则一定是$3NF$,但是一个关系模式$R$如果属于$3NF$,则不一定是$BCNF$。

[例] 关系模式$S(Sno,Sname,Sdept,Sage)$

  • 假定$S$有两个码$Sno,Sname$
  • $S∈3NF$
  • $S ∈ BCNF$

[例]在关系模式$STJ(S,T,J)$中,$S$表示学生,$T$表示教师,$J$表示课程。
函数依赖:

  • $(S,J)→T,(S,T)→J,T→J$

-$(S,J)和(S,T)$都是候选码

在这里插入图片描述

  • $STJ∈3NF$

    • 没有任何非主属性对码传递依赖或部分依赖
  • $STJ \not\in BCNF$

    • $T$是决定因素,在$BCNF$中所有的主属性对每一个不包含它的码,也是完全函数依赖,但$T$不包含码。$STJ$显然不满足。

解决方法:将$STJ$分解为二个关系模式:
$ST(S,T) ∈ BCNF, TJ(T,J)∈ BCNF$

在这里插入图片描述

没有任何属性对码的部分函数依赖和传递函数依赖。

其它数据库系统概论详细请看:

  1. 数据库系统概论①——数据库系统基本概念
  2. 数据库系统概论②——关系数据库基础
  3. 数据库系统概论——关系代数详解
✨$\textcolor{blue}{原创不易,还希望各位大佬支持一下}$ <br/>
👍 $\textcolor{green}{点赞,你的认可是我创作的动力!}$ <br/>
⭐️ $\textcolor{green}{收藏,你的青睐是我努力的方向!}$ <br/>
✏️ $\textcolor{green}{评论,你的意见是我进步的财富!}$ <br/>
相关文章
|
1月前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
33 0
|
2月前
|
SQL 存储 关系型数据库
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
51 0
|
4月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
39 0
|
4月前
|
SQL Oracle 关系型数据库
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
69 0
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
|
6天前
|
关系型数据库 数据库
Postgres数据库获取绝对值的函数
【5月更文挑战第4天】Postgres数据库获取绝对值的函数
21 6
|
12天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
2月前
|
容灾 Java 数据库
OceanBase数据库常见问题之spring boot应用增加了flyway的依赖但没执行如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
2月前
|
数据库连接 API 数据库
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
66 0