背景
背景知识
之前很少做数据库相关工作,平时接触的也少。在前面一个小项目中做了点『数据库设计』(读了这本书才知道我的设计并不是真正的设计),发现很多似是而非的知识点,买了这本书来系统补充下自己的知识。
书籍信息
《数据库技术与应用》 冯凤娟 编著, 清华大学出版社,北京交通大学出版社,2011年4月第一版,普通高等教育『十一五』国家规划教材。
基本学习目标
1. 大致系统学习数据库基础;
2. 大致了解关系数据库背后的数学理论支持;
3. 系统的学习三大范式;
4. 了解数据库设计;
一、概述
基本概念
数据和信息
数据:数据库中存储的基本对象,是指用符号记录下来可以区别的信息。
信息:现实世界中事物的存在方式或运动形态的反映,是人们进行各种活动所需知识。
数据与信息是有固定的联系,数据是信息的载体或是信息的符号表示。信息是被人们消化的数据,是数据的内涵,是对数据的语义解释。数据表示了信息,而信息只有通过数据形式才能被人们理解和接受。
信息=数据+数据处理
数据库(DB)
存放数据的仓库。
基本特点:永久存储,有组织,可共享。
数据库管理系统(DBMS)
作用:组织和存放数据,高效的获取和维护数据。
理解:某种数据模型在计算机系统上的具体实现。
目的:使数据成为方便用户使用的资源,易于为各类用户所共享,并增加数据的安全性、完整性和可用性。
数据库系统(DBS)
定义:管理和控制数据库功能的计算机应用系统。
我们开发人员所接触到的 SQL Server、MySQL、Oracle 这些都是 DBS。
数据模型
定义:现实世界数据特征的抽象,表示实体类型与实体联系的模型。
分类:
- 概念模型/信息模型:按用户的观点对数据和信息建模,不涉及到数据库中的表示,只是用来描述摸个特定组组织所关心的信息结构,用于数据库设计(DBA操作)。
- 数据模型/逻辑数据模型:直面数据库的逻辑结构,是现实世界的第二层抽象,涉及计算机系统和数据库管理系统。分为:层次数据模型、网状数据模型、关系数据模型(最常用)。用于数据库管理系统的实现。
- 物理数据模型:DB底层的抽象,描述数据在系统内部的表示方式(存储)和存取方法(读取),面向计算机。
信息世界的基本概念
- 实体:客观存在可以相互区别的事物。如:一个人,一辆汽车。
- 属性:实体所具有的某一特征(由型/属性名和值组成)。如:学生由学号、姓名、性别、年纪等属性组成。
- 实体型:实体名及其属性名集合。如:学生(学号、姓名、年龄)。
- 实体集:性质相同的同类实体的集合。如:所有学生,所有课程。
- 键(KEY):能唯一标识每个实体的属性或者属性集。如:学号
- 域(Domain):属性的取值范围。如:学号为8位数字
- 联系
- 实体型内部的联系:实体的各属性之间的联系。如:员工编号与职务编号。
- 实体型之间的联系:不同实体集之间的联系。
概念模型/信息模型
E-R 模型/实体-联系模型。E-R 图是只管表示概念模型的工具,E-R基本成分:
- 实体型:矩形方框表示。
- 属性:椭圆形框表示。
- 联系:菱形表示实体内部与实体间的联系。
建立 E-R 模型的过程:
- 确定实体型
- 确定联系类型
- 把实体型和联系类型组成 E-R 图
- 确定实体类型和联系类型的属性
- 确定实体型的关键字
逻辑数据模型和物理数据模型
说明
- 逻辑数据模型/数据模型:按计算机的观点对数据建模。对应的就是选择 RDS 还是其他等。组成
- 数据结构:
- 数据操作:检索和更新(insert,delete,update)
- 数据的完整性约束条件
- 物理数据模型:数据库的具体存储文件。
层次数据模型/树结构
优点:结构简单,层次分明;节点间联系简单,查询效率高。
缺点:只能表示1:n 联系;更新操作复杂;
网状数据模型
pass
关系数据模型
数据结构:一张规范化的二维表。MySQL,SQL Server 都属于这种。
关系(Relation):表示实体与实体间联系;
元祖(Tuple):表中的一行;
属性(Attribute):列
值域(Domain):属性值的取值范围
分量:元祖中的一个属性值;
主关键字(Primary Key)/主键:pass
非主属性(Non Primary Attribute):
外部关键字(Foreign Key):
主表与从表:
关系模式:
关系实例:
面向对象的数据模型
这个和面向对象编程中的对象抽象是一个意思。
DBS 的内部体系结构
三级模式
- 外模式/子模式/用户模式:局部逻辑结构和特征的描述,数据库用户看到的数据视图。
- 模式/逻辑模式/概念模式:DBS 中全体数据的逻辑结构和特征的描述,也是所有用户的公共数据视图。
- 内模式/存储模式:数据在数据库中的内部表示。
BS 的两层映像
人员
数据库管理员(DBA)
职责:
- 安装和升级数据库服务器。
- 决定数据库中的数据内容和结构,即概念模式的定义;
- 决定数据库的存储结构和存储策略,即内模式的定义;
- 定义数据的安全性要求和完整性约束,即说明完整性约束条件和权限控制。
- 监控数据库的使用和运行,即确定备份与恢复的策略。
- 数据库性能监视和优化,即性能调优。
- 数据库的改进和重组,即概念模式的重组。
- 维护介质上的归档数据或者备份数据。
- 联系数据库系统的生产厂商,跟踪技术信息。
PS:我之前认为 DBA 就干2,3,4点,难怪小团队养不起 DBA。现在的开发模式也对 DBA 的需求有所弱化。
二、关系数据库
关系模型的特点:
- 数据结构简单:用二维表格表示实体及实体间的关系;
- 有关系运算理论与关系模式设计理论等扎实理论基础;
组成:关系数据结构、关系操作集合和关系完整性约束条件。
2.1、关系模型的数据结构机器形式化定义
数据结构:关系。
关系模型是建立在集合代数的基础上的。
域
域:一组具有相同数据类型的值的集合。如:{0,1,2,3},{true,false}
笛卡尔积
迪卡尔积:给定一组域 D1,D2,···,Dn,这些域中有些域可以是相同的,也可以是不同的。D1,D2,···,Dn 的笛卡尔积为:D1xD2x···xDn={(d1,d2,···,dn)|di ∈Di, i=1,2,···,n}
- 每个元素(d1,d2,···,dn)中的每一个值 di 称为一个分量,且di ∈Di。
- 每个元素(d1,d2,···,dn)叫做一个 n 元组,或简称元祖(Tuple)。但是元祖不是分量 di 的集合,元祖的每个分量 di 是按顺序的。如:(1,2,3) ≠(2,3,1)
- 笛卡尔积的基数:若 Di(i=1,2,···,n)为有限集,Di 中的集合元素个数称为 Di 的基数,用 Mi(i=1,2,···,n)表示,则笛卡尔积 D1xD2x···xDn 的基数 M 为:M=M1XM2x···xMn
- 笛卡尔积的元数:D1xD2x···xDn 的子集称为域 D1,D2,···,Dn 上的关系,用R(D1,D2,···,Dn)表示,R 表示关系名称,n 是瓜西的度(或叫元数),即笛卡尔积的元数。
关系
- 定义:D1xD2x···xDn的任一子集称为定义在域 D1,D2,···,Dn 上的关系,用 R(D1,D2,···,Dn)表示。R :关系的名称,n:关系的度/元数。
- 关系中的每个元素是关系中的元祖(Tuple),关系中的元祖个数是关系的基数。
- 关系是笛卡尔积的有限子集,所以关系也是一个二维表。
- 关系的列的名字叫属性(Attribute)
- 性质:
- 列是同质的,每列的值来源同一个域;
- 不同的列可以来自同一个域,也可以来着不同的域。
- 列的顺序是无所谓的,即列的次序可以任意变换(必须连同名称一起变换)。
- 关系中任意2个元祖不能完全相同(数学的集合中不能有相同的元素)。
- 元祖的顺序无所谓。
- 关系中的每一分量必须是不可再分的最小数据项(1NF)。
- 关系的类型:
- 基本关系/基本表:实际存在的表,他是实际存储数据的逻辑表示;
- 查询表:是查询结果对应的表;
- 视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据;
- 关系的键:
- 超键(Super Key):能在关系中的唯一地标识一个元祖的属性组的值。
- 候选键(Candidate Key):不含有多余属性的超键(不能再删除属性的 Super Key);
- 主键(Primary Key):若一个关系中有多个候选键,则选定其中一个为主键;
- 外键(Foreign Key):当关系中的某个属性或属性组合虽然不是该关系的关键字或只是关键字的一部分,但却是另外一个关系的主关键字,称该属性或属性组合为这个关系的外部关键字/外键。
- 主属性(Prime Attribute):主键的各个属性
- 非主属性(Non-Key Attribute):不包含在人和候选键中的属性;
关系模式
数据库中要区分型(关系模式)和值(关系)。
关系模式是对关系的描述,关系的具体描述项:
- 关系是笛卡尔积的子集,子集由元祖组成,关系也是元祖的集合。关系模式必须指出这个元祖集合的结构(属性),
- 一个关系通常是由赋予他的元祖语义来确定的。即凡是笛卡尔积集合中的所有符合元祖语义的那部分元素的全体就构成了该关系模式的关系。关系模式的关系必须满足一定的完整性约束条件。这些约束条件或者通过属性取值范围的限定,或者通过属性值之间的相互关联反映出来。
定义:R(U,D,DOM,F)
- R:关系名称
- U:关系的属性名集合
- D :为属性组U 中属性来自的域
- DOM:属性和域之间的映像关系的集合
- F:属性之间数据的依赖关系
因:域名 D 及属性与域之间的映像关系 DOM 常常说明为属性的类型、长度等。
定义简写:R(U)或R(A1,A2,A3,···,An)
- R:关系名;
- U :为属性名的集合
- A1,A2,A3,···,An:为个属性名
关系是关系模式在某一时刻的状态或内容。 关系模式是静态的、稳定的,而关系是动态的,随时间不短编号的。
2.2、关系操作
基本操作
常见操作:查询(QUERY)和插入(INSERT)、删除(DELETE)、修改(UPDATE)两类。
关系的查询表达能力很强,是关系操作中最重要的部分。查询可以分为:选择 (Select),投影 (Project),连接 (Join),除 (Divide),并 (Union),差 (Difference),交 (Intersection)和笛卡尔积等运算。
关系数据语言
按功能划分:
- DDL/数据定义语言:数据库描述
- DML/数据操作语言:操作
- DCL/数据控制语言:完整性和安全性
按表达查询方式分:
结构化查询语言 SQL,是介于关系代数和关系演算之间的一种语言,SQL 不仅具有丰富的查询功能,而且具有数据定义、数据操作和数据控制功能。
按表达查询的方式不同分为:
- 关系代数语言:LS-BL
- 关系演算语言:APLHA
- 具有关系代数和演算双重特点的语言:SQL
2.3、关系的完整性
实体完整性(Entity Integrity)
定义:指在实际存储数据的基本表中,主属性不能取空值。
参照完整性(Referential Integrity)
定义:设 FK 是基本关系 R 的一个或一组属性,但不是关系 R 的主键,如果 FK 与基本关系 S 的主键 PK 相对应,P则称 FK 是基本关系 R 的外键(Foreign Key),并称基本关系 R 为参照关系(Referencing Relation),基本关系 S 为参照关系(Referenced Relation)。
用户定义完整性(User-defined Integrity)
定义:针对某一应用环境的完整性约束条件,翻页的是某一具体应用所涉及的数据应满足的语义要求。
2.4、关系代数
传统的集合运算
相容性:关系 R 和关系 S 具有相同的元素 n(列数 n),且相应的属性值取值同一个域。称 R 和 S 相容。
运算前提:R 与 S 相容
并运算
R∪S = {t|t∈R∨t∈S} : R 与 S 的所有元祖合并,删除重复元祖。
差运算
R-S = {t|t∈R∧ not (t∈S)}:R 中删除与 S 相同的元祖
交运算
R∩S = {t|t∈R∧t∈S} 或者 R∩S = R - (R - S)
广义笛卡尔积
RxS = {t|t=<>}
专门的关系运算
选择,投影,联结,除等运算。
选择运算
定义:从指定的关系中选择满足某个逻辑条件元祖形成一个新的关系。即选择运算从某个关系中选择一个『行』的子集。
投影运算
生产一个关系「列」的子集,他从给的关系中保留指定的属性自己而删去其余属性。
联结运算
三、关系数据库标准语言——SQL
3.5、创建与管理视图
定义
视图是操作基本表的窗口。
说明
- 3层体系结构中,视图对应外模式。
- 派生与基本表或其他视图上且依赖基本表。
- 其定义存储在数据字典中,并不存储视图对应的数据,在使用视图时才去执行定义视图的 Select 语句取对应的数据。所以也本称为[虚表]。
基本操作
- 和基本表一样被查询,被删除。
- 插入、更新、删除操作有一定限制。
- 会触发基本表上定义的触发器。
优点
- 提高数据的安全性:对不同的用户定义不同的视图、使用户只能看到与自己有关的数据。
- 简化查询操作:为复杂的查询建立一个视图,用户不必输入复杂的查询语句,只需对视图进行简单查询即可。
- 保证数据的逻辑独立性:对视图的操作,比如查询,只依赖于视图的定义。当构成视图的基本表出现修改时,只需要修改视图定义中的子查询部分。而基于视图的查询不用修改,保证数据的逻辑独立性。
3.6、创建和管理索引
定义
记录的关键字与其对应地址的对照表,通过他可以快速的找到所需要的内容。
目的
快速的查找数据,从而减少磁盘I/O 操作、改善性能;也可以爆照数据的唯一性。
本质
是一种数据库对象,由数据库(Oracle) 自动使用和维护的。索引与建索引的表在逻辑上和物理上是独立的,所以简历和删除索引,对基本表没有影响。
建立
- 自动:列中有 PRIMARY KEY 或 UNIQUE 约束。
- 手动:用户建立的非唯一性索引。
3.6.1、索引的分类
聚镞索引(CLUSETR)和非聚簇索引 (NON-CLUSTER)
- 聚镞索引(CLUSETR):按照索引的字段排列记录,并安装排好的顺序将记录存储在表中。
- 非聚簇索引 (NON-CLUSTER):按照索引的字段排列记录,但是排列的结果并不会存储在表中,二手存储在其他的位置。
从定义上看,在检索记录时,聚镞索引比非聚镞索引快,因为数据在标准已经依索引顺序排好了,但是当要插入或更新记录时,由于要排序,速度比非聚镞索引慢。
一个表中只能有一个聚镞索引,非聚镞索引不限制个数。
唯一性(UNIQUE)索引
表示每个索引值对应唯一的数据记录,与表中的 PRIMARY KEY 的特性类似。当用户定义的表中某一咧有 PRIMARY KEY 或UNIQUE 约束条件时,系统自动简历一个唯一性索引,索引的名字就是约束条件的名字。
位图(BITMAP)索引
如果索引关键字其值范围较小时,如性别作为关键字,采用非聚镞索引索引查询效率不是很高,此时采用位图索引查询效率较高。
组合索引
将两个或以上字段组合起来建立的索引,单独的字段允许有重复的值。
3.6.2、建立索引的原则
需要遵循下列原则。
- 只对较大的表才简历索引(至少有50调记录以上),并且经常要检索的数据少于总行数的2%~4%。
- 为了加快查询速度,应该在简历索引之前插入数据。如果为了保证数据的唯一性,应该在简历索引之后插入数据。
- 一个表可以创建任意多个索引,单不能太多(一般不超过2~3个)。因为索引会增加系统维护的开销。
- 一般在作为主键的列上建立索引,或在经常出现在 where 字句或联结条件中的列上简历索引,该列成为索引关键字。
- 索引的关键字可以是一列,也可以是多列(参考:组合索引)。
- 对于一般的 B - 树索引,索引关键字必须在其值范围较广的列(如姓名作为关键字,其取值范围很广)。对于位图索引,索引关键字必须是其值范围较小的列(如性别作为关键字,其值只有,男和女)。
- 建立索引不影响 SQL 执行,只提醒在查询速度上。
- 建立索引之后,Oracle 自动维护和使用索引,用户不必对索引做任何工作。
- 如果表较小或者经常更新或者要检索的数据超过表行数的2%~4%、或者索引列不是警察昨晚查询条件时,不要简历索引。否则,反而增加系统维护开销,对查询效率也不是很明显。如果要检索的数据超过表的行数10%,索引未必能改善检索性能。
索引是一个表结构单独的结构。当简历索引时,系统自动简历一个索引对照表,(又称索引段)在索引对照表中包含了索引关键字的值,以及指向该值所在行地址的指针(或者称为 ROWID)。查询时先查询索引对照表,根据指针查询表中的行,从而避免全表扫描,可以加快查询。
有时,索引会改善数据检索的性能,但对于数据修改(DML) 来说,索引会降低性能。因为出了表被修改意外,索引对照表也需要被修改。所以如果表的数据被大量更新,应该删除索引,在更新完成后,重建索引,这样可以改善性能。