Table of Contents
Introduction
数据库管理系统(DataBase-Management System, DBMS) 由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这个数据集合通常称为 数据库(Database) 。
数据库系统的一个主要目的是给用户提供 数据的抽象视图 。
数据库系统通过如下几个层次上的抽象来对用户屏蔽复杂性:
- 物理层。最低层次的抽象,描述数据实际上是怎样存储的。物理层详细描述复杂的底层数据结构。
- 逻辑层。描述数据库中存储什么数据及这些数据间存在什么关系。
- 视图层。最高层次的抽象,只描述整个数据库的某个部分。数据库系统的很多用户并不需要关心所有的信息,而只需要访问数据库的一部分。系统可以为同一数据库提供多个视图。
数据库对象是数据库的组成部分,常见的有以下几种:
1. 表
2. 索引
3. 视图
4. 图表
5. 缺省值
6. 规则
7. 触发器
8. 存储过程
9. 用户
关于 schema、user和database的概念的区别。
在MySQL中,创建一个schema好像就跟创建一个database是一样的效果,在SQL Server和Oracle数据库中好像又不一样。目前我只能理解,在 MySQL中 schema == database。
schema & user
关于 schema 和 user 的定义:
A schema is a collection of database objects (used by a user).
Schema objects are the logical structures that directly refer to the database’s data.
A user is a name defined in the database that can connect to and access objects.
Schemas and users help database administrators manage database security.
从中我们可以看出, schema 为 数据库对象 的集合,为了区分各个集合,需要给这个集合起个名字。一个用户一般对应一个 schema,该用户的 schema 名等于用户名,并作为该用户缺省 schema。
instance
区分 instance 的概念。
数据库系统可以分为几种不同的模式:
1. 物理模式。在物理层描述数据库的设计
2. 逻辑模式。在逻辑层描述数据库的涉及
3. 子模式。在视图层,描述了视图的不同视图
程序员使用逻辑模式来构造数据库应用程序。物理模式隐藏在逻辑模式下,通常可以在应用程序丝毫不受影响的情况下被轻易地更改。
数据模型
数据库结构的基础是数据模型(data model)。数据模型是一个描述数据、数据联系、数据语义以及一致性的概念工具的集合。常用的有如下几种:
- 关系模型(relational model)
- 实体-联系模型(entity-relational model)。实体-联系模型被广泛用于数据库设计。
- 基于对象的数据模型(object-based data model)
- 半结构化数据模型(semistructured data model)
mysql 就是关系模型,关系模型也是目前我们用的最多的。
数据库语言
用数据定义语言(data-definition language,ddl)来定义数据库模式,数据操纵语言(data-manipulation language,dml)来表达数据库的查询和更新。它们并不是分离的语言,相反地,它们简单地构成了单一的数据库语言。
数据库模式是通过一系列定义来说明的,这些定义ddl来表达。
关于约束:
- 域约束(domain constraint)
- 参照完整性(referential integrity)
- 断言(assertion)
- 授权(authorization)
正如其他程序设计语言一样,ddl以一些指令(语句)作为输入,生成一些输出。ddl的输出放在 数据字典(data dictionary) 中,数据字典包含了 元数据(metadata) 。元数据是关于数据的数据。可以把数据字典看做是一种特殊的表,这种表只能由数据库系统本身来访问和修改。在读取和修改实际的数据之前,数据库系统先要参考数据字典。
SQL查询语言
select instructor.name
from instructor
where instructor.dept_name = 'History';
SQL定义语言
create table department
(dept_name char(20),
building char(15),
budget numeric(12,2));
ddl 会更新数据字典,它包含元数据。
dml会更新数据字典吗?
有些 dml 语句可能间接地引起Oracle服务器修改数据字典,如引起表的磁盘存储空间的扩展的insert或者update语句。当这类dml语句被执行时,oracle也要将相关磁盘存储空间变化的信息记录到数据字典上。
关于SQL和通用的程序设计语言(如Java、C++)的关系
为了访问数据库,DML语句需要由宿主 语言来执行。
- 通过提供应用程序接口(过程集),它可以用来将DML和DDL的语句发送给数据库,再取回结果。 与C语言一起使用的开放数据库连接(ODBC)标准,是一种常用的应用程序接口标准。Java数据库连接(JDBC)标准为Java语言提供了相应的特性。
- 扩展宿主语言的语法,在宿主语言的程序中嵌入DML调用。通常用一个特殊字符作为DML调用的开始,并且通过预处理器,称为 DML预编译器(DML precompiler) ,来将DML语句转变为宿主语言的过程调用。
数据库的设计
数据库设计的主要内容是数据库模式的设计。
数据库设计的初始阶段是全面刻画预期的数据库用户的数据需求。为了完成这个任务,数据库设计者有必要和领域专家、数据库用户广泛地交流。这个阶段的成果是制定出用户需求的规格文档。
下一步,设计者选择一个数据模型,并运用该选定的数据模型的概念,将那些需求转换成一个数据库的概念模式。在这个 概念设计(conceptual-design) 阶段开发出来的模式提供了企业的详细概述。设计者再复审这个模式,确保所有的数据需求都满足并且相互之间没有冲突,在检查过程中设计者也可以去掉一些冗余的特性。这一阶段的重点是描述数据以及它们之间的联系,而不是指定物理的存储细节。
从关系模型的角度来看,概念设计阶段涉及决定数据库中应该有哪些属性,以及如何将这些属性组织到多个表中。前者涉及到商业决策,后者主要是计算机科学问题。解决后者问题的方法主要两种:一种是使用实体-联系模型,另一种引入一套算法,这套算法将所有属性集作为输入,生成一组关系表。
再然后是 逻辑设计阶段 。
最后是 物理设计阶段 。
数据存储和查询
数据库系统的功能部件大致可分为存储管理器和查询处理部件。
TODO kgdb 添加其他块的地址
关系模型介绍
关系数据库的结构
关系数据库由表(table)的集合组成,每个表有唯一的名字。表中的一行代表了一组值之间的联系。
在关系模型的术语中,关系(relation)用来指代表,而元组(tuple)用来指代行。属性(attribute)指代的是表中的列。
我们用关系实例(relation instance)表示一个关系的特定实例,也就是所包含的一组特定的行。
由于关系是元组集合,所以元组在关系中出现的顺序是无关紧要的。
对于关系的每个属性,存在一个允许取值的集合,称为该属性的域(domain)。我们要求对所有关系 r 而言,r 的所有属性的域都是原子的。如果域中元素被看做是不可再分的单元,则域是原子的(atomic)。
空(null)值是一个特殊的值,表示值未知或不存在。空值给数据库访问和更新带来很多困难,因此应尽量避免使用空值。
数据库模式
注意区分数据库模式(database schema)和数据库实例(database instance),前者是数据库的逻辑设计,后者是给定时刻数据库中数据的一个快照。
关系的概念对应于程序设计语言中变量的概念,而关系模式(relation schema)的概念对应于程序设计语言中类型定义的概念。
关系模式由属性序列及各属性对应域组成。
关系实例的概念对应于程序设计语言中变量的值的概念。给定变量的值可能随时间发生变化,而关系的模式是不常变化的。
dept\_name | building | budget |
---|---|---|
Biology | Watson | 90000 |
Comp.Sci | Taylor | 100000 |
Elec.Sci | Taylor | 85000 |
考察表 ??? 的department关系,该关系的模式是:
department(dept_name, building, budget)
码
我们需要有一种能够区分给定关系中的不同元组的方法。一个关系中没有两个元组在所有属性上的取值都相同。
超码(superkey)是一个或多个属性的集合,这些属性的组合可以使我们在一个关系中唯一地标识一个元组。
我们通常只对这样的一些超码感兴趣,它们的任意真子集都不能成为超码。这样的最小超码称为候选码(candidate key)。
我们用主码(primary key)这个术语来代表被数据库设计者选中的、主要用来在一个关系中区分不同元组的候选码。
一个关系模式(如 (r_{1}) )可能在它的属性中包括另一个关系模式(如
r_2
)的主码。这个属性在 (r_{1}) 上称作参照 (r_{2}) 的外码(foreign key)。
关系 (r_{1}) 也称为外码依赖的参照关系(referencing relation), (r_{2}) 叫做外码的被参照关系(referenced relation)。
参照完整性约束(referential integrity constraint)。
参照完整性约束要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值。
模式图
一个含有主码和外码依赖的数据库模式可以用模式图(schema diagram)来表示。