数据库原理知识点大纲简单梳理

数据库原理知识梳理
一、DBS系统构成
1、DB的概念与特点:
数据库(DB)是存储在计算机系统内的有结构的数据集合,是相关数据的集合,数据由数据库管理系统统一管理和维护。
数据(Data)指的是可观察的客观事实,并且有隐含的含义。
在数据库中,数据与数据的含义(数据名称及说明)同时存储。
数据的最小存取单位是构成记录的、有名称的、有含义的最小数据单位——数据项。
定义数据库时,必须定义数据项的逻辑结构。
在使用数据库时,以数据项名存储数据、更新数据以及查询和使用数据。
在数据库中,不仅包含数据本身,还包含了数据结构和约束的完整性定义或者描述。这些定义存储在DBMS的目录中,称为数据库的元数据或者数据字典。
任何合法用户都可以在元数据的帮助下,利用数据项名方面的访问数据库中的数据以及他们的逻辑定义,并使用这些数据,亦即数据可高度共享。
数据库是存储在计算机系统内的有结构的数据的集合,数据是由数据库管理系统管理的。

2、DBS特点与组成要素:
DBS是指在计算机系统中引入数据库后的数据构成,由计算机硬件、操作系统、DBMS、DB、应用程序和用户以及数据库开发和管理人员等组成。
数据库系统区别于传统文件处理系统的最重要特征是引入了数据库这个概念,以及产生数据库管理系统。
与文件系统相比,DBS有如下四个主要特点:
整体数据结构化:数据库中的任何数据都是公开的,不属于任何应用,结构是全面的。
数据的共享度高:在显示数据的同时可以显示数据的逻辑结构;整个组织的整体数据被综合考虑,整体数据结构化。可以方面的使用数据和扩充新的应用。
数据的独立性高:数据与数据的结构存储在数据库中,应用程序既不存储数据也不存储数据的逻辑结构。数据与程序相对独立。
高度的数据控制能力:具有较高的数据安全性;较好的数据完整性;较强的并发控制能力;较强的数据恢复能力。

3、DBMS的功能:
数据库管理系统是专门用来实现和维护数据库而建立的通用软件。
DBMS是操作系统支持下工作的数据管理软件,是支持用户创建和维护数据库的一组程序包。对内负责管理数据库,对外向用户提供一整套命令。用户可以通过命令来创建数据库,定义数据,对数据库中的数据进行各种合法的操作。
DBMS有如下六种基本功能:
数据定义:用户可以利用数据定义语言(DDL)来方便地定义数据库中数据的逻辑结构。
数据操纵:用户可以利用数据操纵语言(DML)来实现对数据库对数据库中数据的插入、查找、修改或者删除操作。
完整性约束检查:检查数据时候符合一定的规定。
访问控制:通过数据控制语言(DCL)来实现对不同级别用户的访问控制功能。
并发控制:通过只用并发控制功能,可以确保试图更新同一数据的多个用户能够以一种受控的方式完成各自的工作,即避免并发操作时可能带来的数据不一致性。
数据恢复:恢复数据库。

4、DBA的职责
数据库管理员的主要职责有:
在用户与数据库开发人员之间进行沟通和协调。
参与数据库设计工作。
决定数据的完整性约束和不同用户的存取权限。
保证数据库的正常运行,进行数据库的维护工作。
提出数据库的重构计划。

二、DB的三级模式与关系数据模型的实例
数据的三级模式结构包括外模式、模式和内模式。

模式:也成逻辑模式,是数据库中全体数据在逻辑上的视图。逻辑结构包括数据记录的名称,数据项的名称、类型、域值。通过模式DDL来进行模式的定义。
数据库中存储的是数据及数据之间的联系。
Transaction:事务
数据库是在计算机系统中按照一定的数据模型组织、存储和应用的数据的集合。
关系数据操作语言(DML)的特点是:操作对象与结果均是 关系、操作的非过程性强 、语言一体化,并且是建立在数学理论的基础上的。

三、SQL语言的特点
一体化
面向集合的操作方式。
高度非过程化
两种使用方式,统一的语法结构。
语言简洁,易学易用。

四、视图的定义
视图是从一个或多个关系(基本表或已存在的视图)导出的关系。是数据库系统的一个重要机制。

五、视图与基本表的区别与联系
视图是虚表,在一般情况下不建立索引。
sql一般也不提供修改视图定义的语句。
对视图中数据进行更新是有限制的。

六、数据模型的三要素
数据结构
数据操作
完整性约束

七、事务
事务是数据库操作的最小逻辑工作单元,是一系列SQL操作的集合。
事务必须具有的四个性质(ACID特性)是:原子性、一致性、隔离性和持久性。
提交(commit transaction):使事务成功地结束。所执行事务对数据库的所有更新将永远存在。
回滚(rollback transaction):即在事务的运行过程中发生了某种故障,事务不能继续运行,影响该事务的SQL语句所造成的任何改变必须全部作废,回滚到事务开始前的状态。

八、并发操作的三类问题
丢失更新:写写冲突,加排它锁X
读“脏”数据:写读冲突,加共享锁S
不可重复读:读写冲突

九、数据库系统的基本特点
整体数据结构化
数据的共享度高
数据的独立性高
高度的数据控制能力。

十、数据库的基本特点
数据可以共享
数据独立性
数据冗余小,易扩充
统一管理和控制。

十一、自然连接与等值连接的区别
自然连接要求相等的分量必须有共同的属性;等值连接就不需要。
自然连接要求把结果中的所有重复属性名都去掉一个;等值连接却不这样。

十二、SQL语言分类
DDL数据定义语言:负责创建、修改、删除表、索引和视图等对象,由动词 create, alter, drop 组成。
DML数据操作语言:负责数据库中数据的插入、修改、查询和删除操作,由动词 insert, update, select, delete 组成。
DCL数据控制语言:用来授予和撤销用户对数据的操作权限,由动词 grant, revoke 组成。

十三、SQL数据类型
int/integer:全字长整数型
smallint:半字长整数型
decimal(p[,q]):精确数值型,共p位,小数点后有q位。
float:双字长浮点数
char(n):长度为n的定长字符串
varchar(n):最大长度为n的变长字符串。
datetime:日期时间型,格式可以设置

十四、数据完整性约束
not null:不为空
null:可以为空
unique:不能有相同的值

十五、集函数
count(distinct/all *):统计结果中元组个数
count(distinct/all<列名>):统计结果中某列值的个数
max(<列名>):给出一列上的最大值
min(<列名>):给出一列上的最小值
sum(distinct/all<列名>):给出一列上值的总和
avg(distinct/all<列名>):给出一列上值的平均

十六、特殊运算符
[公式]

十七、查询方式
1、分组查询

where子句作用于基表或者视图,从中选择满足条件的元组;having子句作用于分组后的组,从中选择满足条件的组。
2、排序查询

用 order by 进行默认升序排序
在列名后面添加 desc 进行降序排序
3、多关系连接查询

交叉连接: cross join ,两表之间没有任何联系
select [distinct/all] <目标列清单>
from <关系名[别名]清单>
2.内部连接: inner join ,两表之间具有共同性质的属性。

select [distinct/all] <目标清单>
from <关系名1> inner join <关系名2>
on <连接条件>
3.外连接: outer join

4.自身连接: self join

4、嵌套查询

如果子查询的返回结果总是单个值,那么可以用“=”来代替“in”。
在嵌套查询中可以使用比较运算符来构成它的连接词。如 < , > , = , <= , >= , <>
在比较运算符的后面可以加上 any 后者 all , any 只需其中的一个即可, all 表示必须全部满足。
在使用嵌套语句时也可以结合 between…and…
十八、select语句的集合操作
集合操作主要包括并(union),交(intersect),差(except/minus)
select默认保留重复的元素,除非使用 distinct 进行指明。但是select语句的集合操作,在默认情况是消除重复元组的,要想保留,需要在集合操作的关键字后面加上 all。
十九、视图操作
1、定义视图

create view <视图名>
as <子查询>
[with check option]
若有 with check option ,则今后在对此视图,进行 insert, update, delete 操作时,会自动检查是否符合原定义视图子查询中的<条件表达式>。
视图是数据库中数据的物理独立性和逻辑独立性的重要支柱。
2、删除视图

drop view
二十、参照完整性约束的实现策略
限制策略: no action
级联策略: cascade
置空策略
二十一、完整性约束
实体完整性:通过主码定义来完成
参照完整性:外部码约束references 和参照完整性约束
用户自定义完整性:基于属性和元组的check约束
二十二、触发器的基本概念
触发器,就是一类由数据库操作实践(插入、删除、修改)驱动的特殊过程,一旦由某个用户定义,任何用户对该触发器指定的数据进行增、删或改操作时,系统将会自动激活相应的触发动作,在数据库服务器上进行集中的完整性控制。
tigger
二十三、访问控制
授予权限 grant
收回权限 revoke
二十四、规范化
1、未规范化的数据存在的问题

数据冗余度大,主要由于属性之间的约束关系太强导致。
修改异常。
插入与删除异常。
2、规范化后的数据的好处

数据量减少
表达能力增强
修改方便
找出所有没有选修1号课程的学生姓名;
select sname
from student
where sno not in --“ not in ”等同于“ <> all ”
(select sno
from grade
where cno=‘1’)

找出选修了全部课程的学生姓名。
–(提示:可找出这样的学生,没有一门课程是他不选修的。)
Select sname from student
Where not exists ( select cno from course
Except
Select cno from grade where grade.sno=student.sno )
数据库范式1NF 2NF 3NF BCNF(实例)
设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据,从而导致创建多余的表。范化是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。

下面是范化的一个例子:

Customer ; Item purchased ; Purchase price
Thomas ; Shirt ; $40
Maria Tennis; shoes ; $35
Evelyn ; Shirt ; $40
Pajaro ; Trousers ; $25
如果上面这个表用于保存物品的价格,而你想要删除其中的一个顾客,这时你就必须同时删除一个价格。范化就是要解决这个问题,你可以将这个表化为两个表,一个用于存储每个顾客和他所买物品的信息,另一个用于存储每件产品和其价格的信息,这样对其中一个表做添加或删除操作就不会影响另一个表。

关系数据库的几种设计范式介绍
1、第一范式(1NF)

在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。

2、第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。如图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。

第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

3、第三范式(3NF)

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

数据库设计三大范式应用实例剖析
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。

设计范式是不是很难懂呢?非也,大学教材上给我们一堆数学公式我们当然看不懂,也记不住。所以我们很多人就根本不按照范式来设计数据库。

实质上,设计范式用很形象、很简洁的话语就能说清楚,道明白。本文将对范式进行通俗地说明,并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。

范式说明
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

例如,如下的数据库表是符合第一范式的:

字段1 字段2 字段3 字段4
而这样的数据库表是不符合第一范式的:

字段1 字段2 字段3 字段4
     字段3.1 字段3.2   
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。

第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:

(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
这个数据库表不满足第二范式,因为存在如下决定关系:

(课程名称) → (学分)
(学号) → (姓名, 年龄)
即存在组合关键字中的字段决定非关键字的情况。

由于不符合2NF,这个选课关系表会存在如下问题:

(1) 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

(2) 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

(3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

(4) 删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

把选课关系表SelectCourse改为如下三个表:

学生:Student(学号, 姓名, 年龄);
课程:Course(课程名称, 学分);
选课关系:SelectCourse(学号, 课程名称, 成绩)。
这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。

另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:

关键字段 → 非关键字段x → 非关键字段y
假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:

(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:

(学号) → (所在学院) → (学院地点, 学院电话)
即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。

把学生关系表分为如下两个表:

学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 地点, 电话)。
这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。

鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。

假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

(仓库ID, 存储物品ID) → (管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:

(1) 删除异常:当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。

(2) 插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。

(3) 更新异常:如果仓库换了管理员,则表中所有行的管理员ID都要修改。

把仓库管理关系表分解为二个关系表:

仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

范式应用
我们来逐步搞定一个论坛的数据库,有如下信息:

(1) 用户:用户名,email,主页,电话,联系地址
(2) 帖子:发帖标题,发帖内容,回复标题,回复内容
第一次我们将数据库设计为仅仅存在表:

用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容
这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段,即将表修改为:

用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题 回复内容
这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:

(用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)
但是,这样的设计不符合第二范式,因为存在如下决定关系:

(用户名) → (email,主页,电话,联系地址)
(发帖ID) → (发帖标题,发帖内容)
(回复ID) → (回复标题,回复内容)
即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。

我们将数据库表分解为(带下划线的为关键字):

(1) 用户信息:用户名,email,主页,电话,联系地址
(2) 帖子信息:发帖ID,标题,内容
(3) 回复信息:回复ID,标题,内容
(4) 发贴:用户名,发帖ID
(5) 回复:发帖ID,回复ID
这样的设计是满足第1、2、3范式和BCNF范式要求的,但是这样的设计是不是最好的呢?

不一定。观察可知,第4项"发帖"中的"用户名"和"发帖ID"之间是1:N的关系,因此我们可以把"发帖"合并到第2项的"帖子信息"中;第5项"回复"中的"发帖ID"和"回复ID"之间也是1:N的关系,因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余,新的设计为:

(1) 用户信息:用户名,email,主页,电话,联系地址
(2) 帖子信息:用户名,发帖ID,标题,内容
(3) 回复信息:发帖ID,回复ID,标题,内容
数据库表1显然满足所有范式的要求;

数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;

数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖,也不满足第二范式的要求,但是与数据库表2相似,这一设计也不会导致数据冗余和操作异常。

由此可以看出,并不一定要强行满足范式的要求,对于1:N关系,当1的一边合并到N的那边后,N的那边就不再满足第二范式了,但是这种设计反而比较好!

对于M:N的关系,不能将M一边或N一边合并到另一边去,这样会导致不符合范式要求,同时导致操作异常和数据冗余。

对于1:1的关系,我们可以将左边的1或者右边的1合并到另一边去,设计导致不符合范式要求,但是并不会导致操作异常和数据冗余。

结论
满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的,在数据库表中存在1:1或1:N关系这种较特殊的情况下,合并导致的不符合范式要求反而是合理的。

在我们设计数据库的时候,一定要时刻考虑范式的要求。

相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页