小尹的博客

Hi, nice to meet you.

  1. 1. 概述
  2. 2. 关系数据模型
    1. 2.1. 关系数据结构
    2. 2.2. 关系操作集合
      1. 2.2.1. 基本的关系操作
      2. 2.2.2. 关系数据语言的分类
      3. 2.2.3. 关系代数
        1. 2.2.3.1. 传统的集合运算
        2. 2.2.3.2. 专门的关系运算
    3. 2.3. 关系模型的完整性约束
      1. 2.3.1. 关系模型的三类完整性约束
      2. 2.3.2. 关系模型完整性约束的检验
  3. 3. 关系数据库的规范化理论
    1. 3.0.1. 函数依赖与关键字
    2. 3.0.2. 范式与关系范式化过程
  • 4. 附记
  • 概述

    • 目前应用最广泛的数据库
    • 数据的逻辑模型是 关系模型
    • 数据库操作建立在关系代数基础上

    基本特征:使用关系模型组织数据

    时间轴:

    · 20世纪70年代末,关系方法的理论研究和系统软件(IBM 的 SystemR 和 SQL/DS)研制取得重大突破

    · 20世纪80年代,关系模型逐渐取代网状模型和层次模型

    关系数据模型

    关系模型三要素:关系数据结构、关系操作集合、关系完整性约束。

    关系数据结构

    关系数据模型仅包含单一数据结构:关系。以学生表为例:

    学号 姓名 性别 班级
    001 张三 A
    002 李四 A
    003 小明 B
    1. 表(Table)==关系(Relation):是一个二维数据结构,由表名和各列、各行数据组成,每个表有唯一表名每一行描述一条具体记录值;关系(表)有三种类型,即,基本关系(基表)查询表视图表,分别代表实际存在的表、查询结果对应的表、基表或其他视图之上建立的虚表(没有实际物理记录),表是内模式,视图是外模式
    2. 列(Column)==字段(Field)==属性(Attribute):每一列表示实体的一个属性,具有相同数据类型。列的个数称为关系的元数(或度数),列的值称为属性值,属性值的取值范围称为值域
    3. 行(Row)==元组(Tuple)==记录(Record),行的个数称为关系的基数
    4. 分量(Component):元组中的一个属性值,如元组(002, 李四, 女, A)的每一个属性值,002、李四、女、A,都是这个元组的分量
    5. 码(或键, Key):能够用来唯一标识关系的每个元组的属性或属性组(任意两个元组在该属性或属性组上值的组合都不相同)
    6. 超码(或超键, Super Key):在关系的一个码(唯一标识的属性组)中移除某个属性,这个属性组仍是关系的码,这样码(或键)称为该关系的超码(或超键);每个关系至少存在一个超码,即该关系所有属性的集合,也是该关系最大的超码;如(学号, 姓名, 性别, 班级)、(学号, 姓名)都是学生表的超码
    7. 候选码(或候选键, Candidate Key):在关系的一个码中,不能移除任何一个属性,否则这个属性组就不是关系的码,这样的码称为该关系的候选码(或候选键);所以,候选码是关系最小的超码,如学号是学生表的候选码,(学号, 课程号)是成绩表的候选码
    8. 主码(或主键, Primary Key):若干候选码中,被指定用来唯一标识元组的一个候选码
    9. 全码(或全键, All-Key):关系的主键是这个关系模式的所有属性集合
    10. 主属性(Primary Attribute):候选码中的任何一个属性
    11. 非主属性(Nonprimary Attribute):不在候选码中的属性
    12. 外码(或外键, Foreign Key):不是所在关系的主键或候选键,而是另一关系的主键或候选键的属性(属性组)
    13. 参照关系(或从关系, Referencing Relation):外键相关联的两个关系中,外键所在的关系
    14. 被参照关系(或主关系, Referenced Relation):外键相关联的两个关系中,外键作为主键的关系
    15. 域(Domain):属性的取值范围,如性别,域为“男”、“女”、“第三性别”
    16. 数据类型(Data Type):如姓名的类型应为字符型varchar
    17. 关系模式(Relation Schema):数据模型的“型”是指某一类数据的结构和属性、“值”是指型的具体赋值,而关系数据库的“型”是指关系模型、“值”是指关系,即 关系模式是对关系的描述 ;所以关系模式是静态的、稳定的,关系是动态的、变化的, 关系是关系模式在某一时刻的状态或内容 ,如学生表对应的关系模式(表结构)通常是不变的,但由于新生入学,毕业生离校,其内容会经常发生变化。
    18. 关系数据库(Relation Database):关系模型作为数据的逻辑模型,关系作为数据组织方式的一类数据库。

    关系数据库对关系的限定:

    1. 每个属性都是不可分解的,不允许表中有表
    2. 每个关系仅有一种关系模式(属性的类型和个数固定)
    3. 属性必须命名,同一关系模式中属性名不能相同
    4. 不允许出现候选键值完全相同的元组
    5. 元组顺序和属性顺序可任意交换

    关系操作集合

    基本的关系操作

    关系模型常用的关系操作包括两大部分:查询(Query)操作、插入(Insert)删除(Delete)修改(Update)操作。

    查询是关系操作最主要的部分,可以分为:

    关系操作的对象和结果都是集合,因此也被称为一次一集合(Set-at-a-time)

    关系数据语言的分类

    关系语言的特点(优点)是高度非过程化:用户不必建立特殊的存取路径,存取路径由DBMS优化机制选择;不必使用循环和递归完成数据的重复操作。

    关系数据语言分为三类:关系代数语言、关系演算语言、SQL语言

    • 关系代数、元组关系演算、域关系演算均是抽象查询语言,与数据库中实现的实际查询语言不同,实际查询语言除了提供关系代数或关系演算之外,还提供了如聚合函数、关系赋值、算术运算等附加功能
    • 三类语言的共同特点是:完备的表达能力、非过程化操作集合、功能强、既能独立使用也可以嵌入高级语言使用

    关系代数

    • 关系代数是以集合代数为基础发展起来的一种抽象的关系操作语言。

    • 关系运算操作包含三要素:操作符 (作用于)-> 操作对象 (得到)-> 操作结果,

    • 运算(操作)对象是关系,运算(操作)结果亦为关系。

    关系代数的运算符:

    运算符 含义
    集合运算符
    × 笛卡尔积
    专门的关系运算符 σ 选择
    Π 投影
    连接
    ÷

    辅助专门的关系运算符的运算符:

    比较操作符:>、≥、<、≤、=、≠

    逻辑运算符:∧(与)、∨(或)、┐(非)

    关系代数操作经过有限次复合的表达式称为关系代数表达式,是一种抽象的数据库操作语言,按照运算符的不同,关系代数的操作可分为传统的集合运算与专门的关系运算。

    传统的集合运算

    集合运算是二目运算,将关系看成元组的集合,从行的角度进行运算。

    Table: Students_1

    NO Name Class
    901001 晓明 A
    901002 徐昆 B
    901003 小六 A

    Table: Students_2

    No Name Class
    901004 刘能 C
    901005 宝强 D
    901001 晓明 A

    (1). 并(Union)

    R3 = R1 ∪ R2

    R3由关系R1和R2所有不同元组(去掉重复元组后的所有元组)组成,R1和R2字段的个数相同,字段的值域相同。

    Students_1 ∪ Students_2的结果:

    No Name Class
    901001 晓明 A
    901002 徐昆 B
    901003 小六 A
    901004 刘能 C
    901005 宝强 D

    (2). 差(Difference)

    R3 = R1 − R2

    R3由属于R1,但不属于R2的元组组成,R1和R2字段的个数相同,字段的值域相同。

    Students_1 − Students_2的结果:

    NO Name Class
    901002 徐昆 B
    901003 小六 A

    (3). 交(Intersection)

    R3 = R1 ∩ R2,也可以用差运算表示,R1 ∩ R2 = R1 − (R1 − R2)

    R3由既属于R1,又属于R2的元组组成,R1和R2字段的个数相同,字段的值域相同。

    Students_1 ∩ Students_2的结果:

    NO Name Class
    901003 小六 A

    (4). 笛卡尔积(Cartesian Product)

    R3 = R1 × R2

    R3是由R1和R2所有元组连接而成的新关系,假设R1为m元关系(m个字段),R2为n元关系,则R3为(m+n)元关系,且R3中元组前m个分量(元)是R1的一个元组,后n个分量是R2的一个元组,例:

    Table: Students

    SNO SName
    901001 晓明
    901002 徐昆
    901003 小六

    Table: Course

    CNo CName CRoom
    1 数据库 C5-201
    2 Java C5-307

    Students × Course的结果:

    SNO SName CNo CName CRoom
    901001 晓明 1 数据库 C5-201
    901001 晓明 2 Java C5-307
    901002 徐昆 1 数据库 C5-201
    901002 徐昆 1 Java C5-307
    901003 小六 1 数据库 C5-201
    901003 小六 1 Java C5-307
    专门的关系运算

    专门的关系运算从行和列的角度进行运算。

    (1). 选择(Select)

    其中,F为条件表达式,R为指定的被运算关系名。

    选择运算是从指定关系中选取满足条件的若干元组,由这些元组组成一个新关系,其形式为:

    SELECT 关系名 WHERE 条件

    其中条件是由常数、属性名和比较操作符、逻辑运算符组成的表达式。

    例如,找出Students_1里所有A班同学

    SELECT Students_1 WHERE Class = ‘A’

    其运算结果为

    NO Name Class
    901001 晓明 A
    901003 小六 A

    (2).投影(Projection)

    其中,R为被运算关系名,A为属性序列。

    投影运算是从指定关系中选取指定的(若干)属性名,组成一个新关系,其形式为:

    PROJECTION 关系名 (属性名1, 属性名2, …, 属性名n)

    例如找出Students_1班级情况

    PROJECTION Students_1 (NO, Class)

    其运算结果为

    NO Class
    901001 A
    901002 B
    901003 A

    投影运算形成的新关系不包含重复元组

    (3).连接(Join)

    连接也称为θ连接

    其中,R和S代表两个不同的关系,i和j分别代表R的第i列和S的第j列,θ代表比较运算符。

    从笛卡尔积R×S中选取i属性与j属性上满足θ的元组,这些元组组成一个新的关系,其形式为:

    JOIN 关系名1 AND 关系名2 WHERE 条件

    等值连接自然连接是连接操作中最常用的两种链接:

    1. 等值连接是θ为“=”的连接操作,它从R×S中选取i和j的属性值相等那元组。

    2. 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把属性重复的属性去掉。

    等值连接是从行的角度进行运算,但自然连接还需取消重复列,所以自然连接是同时从行和列的角度进行运算

    自然连接用于构造新关系,投影和选择用于分解关系。

    一般地,如果两个关系没有公共属性,它们的自然连接就变成笛卡尔积

    Table: Students_3 S3

    No Name Class
    902005 Alex C
    902006 Bob C
    902007 Carey D
    902008 Dick D

    Table: Courses_3 C3

    No Course
    902005 Spring Boot
    902006 ASP.NET Core
    902007 EF Core
    902007 Spring Boot
    902009 MyBatis

    S3⋈C3 S3.No = C3.No 等值连接:

    S3.No Name Class C3.No Course
    902005 Alex C 902005 Spring Boot
    902006 Bob C 902006 ASP.NET Core
    902007 Carey D 902007 EF Core
    902007 Carey D 902007 Spring Boot

    S3⋈C3 自然连接:

    No Name Class Course
    902005 Alex C Spring Boot
    902006 Bob C ASP.NET Core
    902007 Carey D EF Core
    902007 Carey D Spring Boot

    (4). 除(Division)

    R ÷ S

    假设被除关系R为m元关系,除关系S为n元关系,则运算结果为一个m-n元关系。

    先将m-n列的值分组(去重),检查每个组的其它列是否包含S的全部元组,若包含,则该组的值作为商关系的一个元组。

    除法是笛卡尔乘积的映射

    Table: Student_Course

    Name Course
    Alex Java
    Alex C#
    Bob C#
    Carey Java
    Dick Java
    Dick C#

    Table: Course

    Course Room
    Java B6-101
    C# B6-205

    Student_Course ÷ Course(查询出选修了所有课程的学生)的结果:

    Name
    Alex
    Dick

    关系模型的完整性约束

    • 数据完整性包括两方面:与现实世界中应用需求的数据的正确性、相容性和一致性;数据库内数据之间的正确性、相容性和一致性。

    • 数据完整性由完整性规则来定义,关系模型的完整性规则是对关系的某种约束,也称为完整性约束,它保证用户操作数据库时不会破坏数据完整性。

    关系模型的三类完整性约束

    (1). 实体完整性约束(Entity Integrity Constraint)

    实体完整性约束是指关系的主属性不能为空(NULL),关系数据库系统中,实体完整性是指实际存储数据的表中,主键不能重复也不能取NULL值

    (2). 参照完整性约束(Referential Integrity Constraint)

    参照完整性约束就是定义外键与主键之间的引用规则:若属性(属性组)F是关系R的外键,与关系S的主键K相对应,则R中每个字段在F上的值只允许两种可能,要么为NULL,要么等于S中某个字段在K上的值。

    (3). 用户定义完整性约束(User-defined Integrity Constraint)

    用户定义完整性约束是针对某一应用环境的完整性约束条件,这类完整性规则可在建立数据表时定义,也可在程序中进行检查和控制。

    关系模型完整性约束的检验

    (1). 执行插入操作时

    首先检查实体完整性约束:检查插入行主键的值是否已经存在,若不存在,再检查插入行主键的值是否为NULL,若不为NULL,继续执行

    然后检查参照关系完整性约束:如果向被参照关系插入,不考虑此约束,如果向参照关系插入,检查插入行的外键值是否在参照关系的主键值中存在,若存在,继续执行,如不存在,可将外键值改为NULL值(假设外键允许为NULL)再继续执行

    最后检查用户定义完整性约束

    (2). 执行删除操作时

    检查参照关系完整性约束:如果删除被参照关系中的行,检查被删除行的主键值时候正在被对应的参照关系引用,若未被引用,执行删除操作,若正在被引用,有三种可能的做法:

    1. 拒绝删除
    2. 空值删除:将参照关系对应的外键改为NULL(假设外键允许为NULL)
    3. 级联删除:将参照关系对应的外键所在的行删除

    (3). 执行更新操作时

    可以看成先执行删除操作,再执行插入操作

    关系数据库的规范化理论

    关系模式(Relation Schema):关系的描述,用于说明数据库中有哪些表,表有那些列,通过这些结构,设计出一个符合功能需求的数据库结构。

    关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映象关系。

    关系数据库的规范化理论:

    1. 是关系数据库设计的理论依据
    2. 研究个属性之间的依赖关系对关系模式性能影响
    3. 提供判断关系模式优劣的理论标准

    关系模式可能存在的冗余和异常问题:

    1. 数据冗余:同一数据被反复存储
    2. 更新异常:数据冗余导致更新同一数据时需修改多处
    3. 插入异常:数据不能执行插入操作,比如该关系模式中,一部分关键字为空
    4. 删除异常:不应该删除的数据被删除,假设有一个关系模式供应商(供应商名, 地址, 货物名称),删除了某个供应商的所有货物的同时也删除了这个供应商的信息

    解决上述问题需要引入数据依赖,数据依赖是作为关系模式取值的一种约束条件,任何一个关系都必须满足,其中两种重要类型的数据依赖:函数依赖(Functional Dependency, FD)和多值依赖(Multi-Valued Dependency, MVD)。

    函数依赖与关键字

    函数依赖是指关系中属性间的对应关系

    • 定义一:函数依赖

      关系R中,属性X的每一个值,属性Y只有唯一值与之对应,则称X 函数决定 Y,或Y 函数依赖于 X,记作X→Y,其中X称为决定因素

    函数依赖根据性质不同可分为完全函数依赖、部分函数依赖和传递函数依赖。

    • 定义二:完全函数依赖

      X、Y为关系R的属性集,若X 函数决定 Y,且对X中的任何真子集(A包含于B,且A不等于B,则集合A是集合B的真子集)X‘满足X’ 不函数决定 Y,则称Y 完全函数依赖 于X

      例如,学生成绩的关系模式(SNO, CNO, GRADE),学号、课程号、成绩,在该关系中,函数依赖 (SNO, CNO)→GRADE 为完全函数依赖,因为SNO和CNO都不能单独 函数决定 GRADE,SNO和CNO为主属性。

    • 定义三:部分函数依赖

      X、Y为关系R的属性集,若X 函数决定 Y,且X中存在一个真子集X‘满足X’ 函数决定 Y,则称Y 部分函数依赖于 X

    • 定义四:传递函数依赖

      X、Y、Z为关系R的属性集,若X 函数决定 Y但Y 不函数决定 X,而 函数决定 Z则有X 函数决定 Z,称为Z 传递函数依赖 于X

      例如,图书出版社的关系模式(BNO, PNAME, PADDRESS),书号、出版社名、出版社地址,一个书号只能为一家出版社出版,但一家出版社可以出版许多书号,所以该关系存在依赖:BNO→PNAME & PNAME→PADDRESS,但 PNAME !→ BNO,所以BNO→PADDRESS为传递函数依赖。

    • 定义五:关键字

      关系R中,U为全部属性集合,X为U的子集(A包含于B,且A可能等于B,则集合A是集合B的子集),若X 完全函数依赖 于U,则X为R的一个候选关键字

      一个关系可能存在多个候选关键字,通常选择其中之一作为主键,候选关键字中包含的属性称为主属性,不包含在内的属性称为非主属性

    • 补充定义六:平凡函数依赖

      关系R中,属性集合Y是属性集合X的子集时(Y⊆X),存在Y 函数依赖于 X,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。

    范式与关系范式化过程

    • 范式是符合某一种级别的关系模式的集合,关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式
    • 满足最低要求的范式是第一范式(1NF),进一步满足更多要求的称为第二范式(2NF),以次类推
    • 一般说来,数据库只需满足第三范式(3NF)
    • 低一级范式通过模式分解(Schema Decomposition),转换为若干高一级别的关系模式的集合,这个过程叫范式化(Normalization)
    • 关系数据库所有关系结构都必须是范式化的(即至少是第一范式的)

    (1). 第一范式

    关系R中每个列与行交点处的取值都是不可再分的基本元素,则R为第一范式。

    即:不满足第一范式的关系为非规范关系,如下关系:

    SNO CNO CNAME TNAME TPLACE GRADE
    902010 C01 MySQL 蔡老师 D1-101 70
    902011 C01 MySQL 蔡老师 D1-101 80
    C02 SQL Server 张老师 D1-102 60

    转为为1NF范式:

    SNO CNO CNAME TNAME TPLACE GRADE
    902010 C01 MySQL 蔡老师 D1-101 70
    902011 C01 MySQL 蔡老师 D1-101 80
    902011 C02 SQL Server 张老师 D1-102 60

    但目前仍存在问题:冗余高(蔡老师的信息存储了两次),插入异常(没有同学选修的课程无法存储到这个关系中),删除异常(若删除最后一条记录,SQL Server这门课的相关信息也被删除了)。

    问题原因:GRADE完全函数依赖于(SNO, CNO),CNAME、TNAME、TPALCE函数依赖于CNO。

    解决方案:将满足函数依赖的属性分解组成多个关系:

    Table: SG

    SNO CNO GRADE
    902010 C01 70
    902011 C01 80
    902011 C02 60

    Talbe: CT

    CNO CNAME TNAME TPLACE
    C01 MySQL 蔡老师 D1-101
    C02 SQL Server 张老师 D1-102

    (2). 第二范式

    关系R为1NF,且R中的所有非主属性都完全依赖于候选关键字,则R为第二范式。

    关系SG和CT满足2NF的定义。

    但目前CT还是存在问题:CT中,若有一位新来的王老师还未分配教学课程,存在插入和删除异常以及修改繁琐的问题。

    问题原因:TPLACE函数依赖于TNAME,TNAME函数依赖于CNO,但CNO不函数依赖于TNAME。

    解决方案:消除CT中主属性对候选关键字的传递函数依赖,继续分解。

    Table: COURSE

    CNO CNAME TNAME
    C01 MySQL 蔡老师
    C02 SQL Server 张老师

    Table: INSTRUCTOR

    TNAME TPLACE
    蔡老师 D1-101
    张老师 D1-102
    王老师 D1-102

    (3). 第三范式

    关系R为2NF,且R中每一个非主属性都不传递函数依赖于候选关键字,则R为第三范式。

    关系COURSE和INSTRUCTOR满足3NF的定义。

    将COURSE的课程CNO替换为学号SNO,得到一个新的选课关系表SCOURSE:

    Table: SCOURSE

    SNO CNAME TNAME
    902010 MySQL 蔡老师
    902011 MySQL 蔡老师
    902012 MongoDB 王老师
    902012 Redis 甄老师
    902013 Redis 贾老师

    目前SCOURSE依然存在问题:一个学生可选多门课程,每一门课程可有多个老师,但每个老师只能指导一门课程,此时,一个新课程和该课程的指导老师的数据要插入到数据库时,必须至少有一个学生选修该课程,且这位老师被分配给他时,才能插入。

    问题原因:SCOURSE的候选关键字为(SNO, CNAME)和(SNO, TNAME),故不存在主属性,也就不存在非主属性对主属性的传递函数依赖,所以SCOURSE也是一个3NF,但是主属性之间存在函数依赖CNAME函数依赖于TNAME。

    解决方案:进一步规范化。

    Table: ST

    SNO TNAME
    902010 蔡老师
    902011 蔡老师
    902012 王老师
    902012 甄老师
    902013 贾老师

    Table: TC

    CNAME TNAME
    MySQL 蔡老师
    MongoDB 王老师
    Redis 甄老师
    Redis 贾老师

    (4). BCNF

    为解决3NF有时出现的异常问题,R.F.Boyce和E.FCodd提出了3NF的改进形式BCNF

    关系R为3NF,X、Y为其属性集,F为其函数依赖集,若F中所有函数依赖X→Y(Y不属于X)中的X必包含候选关键字,则R为BCNF。

    简而言之,若R中每一组函数依赖的决定因素都包含一个候选关键字,则R为BCNF,决定因素可以是单一属性或组合属性。

    满足BCNF条件有:所有非主属性对每一个候选键都是完全函数依赖; 所有的主属性对每一个不包含它的候选键,也是完全函数依赖;没有任何属性完全函数依赖于非候选键的任何一组属性。

    ST和TC满足BCNF的定义。

    附记

    重点:关系模型的基本概念、关系的完整性约束、关系数据库的规范化理论

    难点:关系数据库的规范化理论

    关系数据库的规范化理论,的确难,可能第一遍看明白了,看第二遍之前就忘了,还是多看多理解吧

    本文最后更新于 天前,文中所描述的信息可能已发生改变