前言
数据库系统概论,内容、概念众多,术语众多,必须用通俗易懂的语言进行论证、转述,进行广泛地类比,才能持久性记忆。这里只写较难理解的部分概念和逻辑。
第一章 绪论
基本概念
-
数据独立性:一个设计优秀的数据库应当具备数据独立性
数据独立性:包括物理独立性和逻辑独立性。
1物理存储,2数据的逻辑结构(数据结构)、3应用程序
数据的物理独立性:1变,3不变
数据的逻辑独立性:2变,3依然不变 -
数据模型
按照用途分类,划分为概念模型、逻辑模型、物理模型。
在数据库设计时,我们讨论概念模型;
在数据库管理系统设计时,我们讨论逻辑模型;
在设计数据在计算机硬件上的存储时,我们讨论物理模型。 -
数据模型的组成要素
数据结构、数据操作、完整性约束条件 -
“概念模型”的关联概念:
实体、属性、码、实体集、联系、ER图 -
模式(schema)和实例(instance)
模式是数据库的逻辑结构,就是表的结构;
实例是数据库表的一个剪影,是具体的数据表;
模式稳定,实例时刻变动。 -
三级模式结构
通过一个具体的MySQL数据库设计例子来解释这三重模式。
假设我们有一个学校管理系统的数据库,其中包含学生、教师和课程的信息。
外模式:
学生视图(Student View):包含学生的ID、姓名、年级和选修的课程。
教师视图(Teacher View):包含教师的ID、姓名、所教课程和课程时间。
模式:
学生表(Students):包含学生ID、姓名、年级、性别、出生日期。
教师表(Teachers):包含教师ID、姓名、职称、入职日期。
课程表(Courses):包含课程ID、课程名称、课程描述、学分。
选课表(Enrollments):包含学生ID、课程ID、成绩。
内模式:
数据存储在InnoDB存储引擎中,使用B+树索引优化查询。
学生表和教师表的ID字段被索引以加快搜索速度。
选课表使用复合索引(学生ID和课程ID),以便快速检索学生的选课信息。
在设计时,你需要考虑如何将这些模式转化为MySQL的DDL(数据定义语言)和DML(数据操作语言)命令。例如,创
建模式中的表,定义外模式中的视图,以及设置内模式中的索引和存储参数。
这样的设计允许不同的用户(学生、教师、管理员)通过外模式访问对他们有意义的数据,而不必关心数据的物理存储方式。同时,数据库管理员可以优化内模式以提高性能,而不影响用户的数据视图。模式则作为连接外模式和内模式的桥梁,定义了数据库的逻辑结构。
第二章 关系型数据库
关系型数据库的数据结构使用的数学中的关系模型并且进行一定的修改。
关系相关的术语
域、域的基数、笛卡尔积、元组、分量
- 域:域是一个集合。D1={哈士奇、松狮、藏獒、柴犬},D2={白色、黑色、黄色、花色},D3={中国,美国,日本}
- 域的基数:域的基数是集合内元素的个数。D1={哈士奇、松狮、藏獒、柴犬}的基数是4
- 笛卡尔积:笛卡尔积是很多个集合的组合,由很多个小集合构成。
D1×D2=
(哈士奇, 白色), (哈士奇, 黑色), (哈士奇, 黄色), (哈士奇, 花色),
(松狮, 白色), (松狮, 黑色), (松狮, 黄色), (松狮, 花色),
(藏獒, 白色), (藏獒, 黑色), (藏獒, 黄色), (藏獒, 花色),
(柴犬, 白色), (柴犬, 黑色), (柴犬, 黄色), (柴犬, 花色) - 元组和分量:D1×D2得到的笛卡尔积中包含16个元组,每个元组中包含2个分量,当然每个分量同时也是域中的一个值。
- 区别基数和分量个数:基数是域中元素个数,分量个数是元组中的元素个数,基数等于一个分量可以取的种类数。
- 区别分量和属性:属性是关系中的列名,分量是对应的列的具体值,也是域中的元素
关系、关系的目(度)、单元关系、二元关系
- 关系:关系是一个集合,是笛卡尔积的一个子集。D1×D2的子集被称为建立在域D1和D2之上的关系,表示为R(D1,D2)
- 关系的目(度):关系的目是关系包含的元素个数,是关系所牵扯的域的个数。R(D1,D2)的目是2,R(D1,D2,D3)的目是3
- 单元关系:目为1的关系
- 二目关系:目为2的关系,像是R(D1,D2)
候选码、主码、全码、主属性、非主属性
- 候选码:能够唯一地标识一个元组的属性组,要满足唯一性和最小性。唯一性:候选码中的属性组合必须能够唯一标识每个元组
最小性:不能有多余的属性,即候选码应该是不能再缩减的属性集合 - 主码:受到偏爱的候选码。如果有多个候选码,选择其中一个当主码
- 全码:由一个关系中所有的属性共同构成的候选码被称之为全码
- 主属性:候选码中所包含的属性,只要是候选码中包含的属性都是主属性
- 非主属性:不包含在任何一个候选码中的属性
基本关系(基本表、基表)、查询表、视图表、范式
- 基本关系(基本表、基表):就是你在数据库里手动定义的表
- 查询表:查询结果输出时,显示的表
- 视图表:由基本表导出的表
- 范式:关系必须满足的规范条件,第一范式是一个关系内的每个分量都不能再分割。也就是表中无表,也就是一个关系内的元素必须是原子化的
关系完整性
- 实体完整性:主键、非空……
- 参照完整性:外键
- 用户定义完整性
关系代数
- 象集:在给定输入的情况下,所有可能的输出的集合
- 选择:根据属性来选择元组,输出元组的全部属性
- 投影:根据属性保留列,并且消除重复的元组
- 等值连接:按照属性值相等拼接两张表
- 非等值连接:按照属性值的不等关系拼接两张表
- 自然连接:在等值连接的基础上,删除重复列
- 悬浮元组:**经过自然连接,**别人都连在一起了,只剩下部分孤零零的元组,经过连接操作,不符合连接条件的元组,称悬浮元组。
- 除:对于R÷S,按照属性相同找到重合的元组,比对该元组的属性,若是在R中但不在S中的属性,则保留有对应属性的元组。
关系数据理论
关系模式、依赖
- 关系模式:课本上的关系模式就是指一个三元组:R〈U,F〉,即关系名(属性名,属性之间的关系)。
比如;授课关系(教师名,课程名,教师名->课程名)
完整的关系模式包括以下几个部分。
关系名:这是表格的名字,用来标识这个关系模式。
属性名集合:这是表格中的列名,每个属性名代表一个特定的数据项。
属性的值域:这定义了每个属性可以接受的数据范围或类型。例如,一个属性可能只能接受整数,或者只能接受特定的字符串。
属性间的数据关系:这定义了属性之间的相互关系,例如哪些属性是主键(唯一标识每一行记录的属性),哪些属性是外键(引用其他表格中的主键的属性),以及其他可能的数据完整性约束。 - 数据依赖
平凡的函数依赖:小A的身份证号->小A的姓名,但小A的姓名不包含于小A的身份证号,称小A的身份证号->小的姓名是非平凡的函数依赖。
非平凡的函数依赖:小A的身份证号->小A的出生日期,小A的出生日期包含于小A的身份证号内,称小A的身份证号->小A的出生日期是平凡的函数依赖。
完全函数依赖:
- 小A的身份证号->小A的姓名,但小A的身份证号的一部分推不出小A的姓名,称这种依赖关系为完全函数依赖。
- (身高,体重)->BMI,这是完全函数依赖
部分函数依赖:(身高,体重)->身高达标与否 是部分函数依赖,因为只需要知道身高就足以推断出身高达标与否。
传递函数依赖:身份证号->名字,名字->名字的字数,这里身份证号->名字的字数就是传递函数依赖。
范式、决定因素
一个关系的属性可以分为主属性和非主属性,其中非主属性。
- 决定因素:若X->Y,称这组函数依赖的决定因素是X。
- 第一范式(1NF):不允许分量可以再分,不允许表中有表。
- 第二范式(2NF):非主属性必须完全函数依赖于码。不允许部分函数依赖于码。
- 第三范式(3NF):非主属性必须完全函数依赖于码,不允许部分函数依赖于码。且不允许传递函数依赖于码。
- 拓展第三范式(BDNF)(难以实现):
在满足前三组条件的基础上,增添3个条件:
- 所有非主属性对所有的码都是完全函数依赖。
- 所有主属性对每个不包含它的码都是完全函数依赖。
- 没有任何属性完全函数依赖于非码的任何一组属性。
举例:
满足第一范式,不满足第二范式:
满足第二范式,不满足第三范式:
满足第三范式,不满足BDNF;