由于最近要做ETL项目,所以准备对数据库系统重新再仔细看一下,先看概论后看数据仓库,如果再有时间就研究一下数据挖掘。首先一本好书可以帮你省很多时间,而且让你理解更加透彻,所以我花了点时间调研了一下。数据库系统写得比较好的书籍主要有两本,一本是王珊、萨师煊的《数据库系统概论》,另一本是Abraham Silberschatz等人的《Database System Concepts》,后一本是经典。本文就以王珊、萨师煊的《数据库系统概论》为蓝本进行总结,为图省事,直接以章节来安排下文。
第一章 绪论
绪论主要介绍一些基础和重要的概念,其中我觉得最重要的概念是数据模型,整个数据库里面的重要内容都是围绕这个概念展开的。直接上图:
由于当今主流的数据库都是基于关系模型的,所以有必要对关系模型中的一些专业术语与通常表格的术语进行一下对比:
关系术语 | 关系名 | 关系模式 | 关系 | 元组 | 属性 | 属性名 | 属性值 | 分量 |
表格术语 | 表名 | 表头(表格的描述) | 二维表 | 记录 | 列 | 列名 | 列值 | 记录的列值 |
绪论中最后一个重要的概念就是数据库系统的结构,即三级模式二级映像。直接上图:
上图中外模式我直接就理解为DBA给应用程序开发者分配的访问数据库的用户名/密码,该用户名/密码只能访问部分逻辑结构,模式就是整个数据库中的所有逻辑结构,内模式就是物理模型。
第二章 关系数据库
本章主要讲关系数据库中的理论部分。当然也有一些概念性的东西,对于常用到并且较重要的概念现总结如下:
- 关系有基本关系(基本表或基表)、查询表和视图表三大类。
- 关系的三类完整性约束:实体完整性、参照完整性、用户定义的完整性。实体完整性简而言之就是主属性(候选码的诸属性,一般也就认为是主码的诸属性)不能为空值;参照完整性简而言之就是外码要么为空,要么等于被参照关系中某个元组的主码值; 用户定义的完整性很好理解。
- 关系代数和关系演算部分比较理论,其实主要还是讲了关系代数语言和关系演算语言,当然现在主要用的是关系数据库的标准语言,即结构化查询语言(SQL),所以对关系代数语言和关系演算语言只要了解就行了。
第三章 关系数据库标准语言SQL
如果只在做应用开发时使用到数据库,这一章估计是最重要也是最实用的一章了。
对于具体的语法这里就不再赘述了,使用的时候如果有什么不清楚的可以直接Google,主要还是总结一些概念细节:
- 在定义模式的时候如果没有指定模式名,则模式名隐含为用户名。定义模式实际上定义了一个命名空间,在该命名空间中可以定义包含的数据库对象(基本表、视图、索引等)。每一个基本表都属于某一个模式,有三种方法可以定义基本表所属模式。创建基本表(其它数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式。模式和用户在Oracle中是一对一的关系,某些模式没有对应的用户,比如public和anonymous。
- SQL中域的概念用数据类型来实现。
- DBMS一般会自动建立PRIMARY KEY和UNIQUE列上的索引。一个基本表上最多只能建立一个聚簇索引。
- SQL中查询分为单表查询、连接查询、嵌套查询、集合查询。
- 可以使用换码字符将通配符转义为普通字符。
- GROUP BY子句的重要作用是细化聚集函数(count、sum、avg、max、min)的作用对象,未对查询结果分组,聚集函数将作用于整个查询结果,对查询结果分组后,聚集函数将分别作用于每个组,按指定的一列或多列值分组,值相等的为一组。 HAVING字句一定是跟GROUP BY子句一起出现的,其作用于组,从中选择满足条件的组。
- 嵌套查询中子查询不能使用ORDER BY子句。
- 插入操作可以插入子查询结果。主码是不允许修改的,只能通过删除和增加来实现修改的功能。
- RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新。允许对行列子集视图进行更新,对其他类型视图的更新不同系统有不同限制。
第四章 数据库安全性
数据库安全性中最重要的部分就是存取控制,存取控制又分为自主存取控制和强制存取控制,通常我们接触到的是自主存取控制,在SQL中用GRANT和REVOKE语句来实现。数据库角色:被命名的一组与数据库操作相关的权限,角色是权限的集合。数据库安全性控制还可以通过审计来实现,审计即将用户对数据库的所有操作记录在审计日志上,使用AUDIT和NOAUDIT语句来实现。
第五章 数据库完整性
前面已经提到过了,数据库完整性主要包含实体完整性、参照完整性和用户定义的完整性。本章介绍了DBMS如何提供定义、检查和违约处理的功能。同时可以使用完整性约束命名子句来方便地修改表中的完整性限制,可以通过先删除原来的约束条件,再增加新的约束条件来实现。当然可以通过触发器来实现更为复杂的完整性检查和操作。下表总结了可能破坏参照完整性的情况及违约处理:
被参照表 | 参照表 | 违约处理 |
可能破坏参照完整性 | 插入元组 | 拒绝 |
可能破坏参照完整性 | 修改外码值 | 拒绝 |
删除元组 | 可能破坏参照完整性 | 拒绝/级联删除/设置为空 |
修改主码值 | 可能破坏参照完整性 | 拒绝/级联修改/设置为空 |
第六章 关系数据理论
这一章的主要内容就是讨论关系规范化。
- 第一范式(1NF):关系模式每一个分量必须是不可分的数据项。这是对关系模式的基本要求,这样的关系模式就是合法的、允许的。
- 第二范式(2NF):若关系模式为第一范式,且每一个非主属性完全函数依赖于码,则关系模式为第二范式。
- 第三范式(3NF):每一个非主属性既不部分依赖于码也不传递依赖于码,则关系模式为第三范式。
- 关系模式的规范化过程是通过对关系模式的分解来实现的。
第七章 数据库设计
这一章的实践性是非常强的,学好本章节的最好的方法是自己动手设计一个数据库系统。首先上一个图展示一下数据库设计的基本步骤:
在设计概念结构这一步时,通常使用ER图。设计E-R图时需要消除不必要的冗余,但是并不是所有的冗余数据与冗余联系都必须加以消除,有时为了提高效率,不得不以冗余信息作为代价。如果人为地保留了一些冗余数据,则应把数据字典中数据关联的说明作为完整性约束条件,通常用触发器实现。
逻辑结构设计的主要任务是把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。其中实体型间的联系如何转化为关系模式需要根据不同的情况进行不同的处理。
关系数据库的物理设计的主要内容是:1. 为关系模式选择存取方法(建立存取路径),存取方法主要有索引方法、聚簇、Hash方法;2. 设计关系、索引等数据库文件的物理存储结构。
第八章 数据库编程
这一章对于应用开发者来说是仅次于第二章的次实用章节。
- 嵌入式SQL语句有静态和动态两种,动态指的是执行时传SQL语句的参数。嵌入式SQL语句的游标使用是难点,所有的操作注意判断sqlcode。
- PL/SQL是一种过程语言,它的基本结构是块,有两种类型的块:命名块和匿名块。而存储过程可以指定所使用的语言,一般就选择PL/SQL,存储过程是命名块。