首页
— A First Course in Database systems —
Haifeng Xu
(hfxu@yzu.edu.cn)
This slide is based on Jeffrey D. Ullman's work, which can be download from his website.
数据库
数据库
数据库对于当今的任何部门都是至关重要的. 无论何时访问一个主要的网站, 总有一个数据库在幕后服务, 提供你所需要的信息.
- 公司用数据库来维护其所有重要的记录.
- 在许多科学研究的核心中也同样需要数据库.
数据库管理系统(DBMS)
DBMS--(DataBase Manage System)
数据库就是信息的集合. 一般来讲, "数据库"这个词指的是由数据库管理系统管理的数据的集合.
数据库管理系统将满足
- 允许用户使用专门的数据定义语言来创建新的数据库并指定模式(也就是数据的逻辑结构)
- 给予用户使用适当的语言来查询数据和修改数据的能力. 这种语言通常称为查询语言(query language)或数据操纵语言(data-manipulation language)
- 支持对非常大量的数据(TB级甚至更多)长期存储, 允许高效地存取数据以进行查询和修改其中的数据.
- 使数据具有持久性(durability), 即能够从故障、多种类型的错误或者故意滥用中恢复.
- 控制多个用户同时对数据进行访问, 不允许用户间有不恰当的相互影响(称作孤立性(isolation)), 并且不会发生在数据上进行了部分的而不是完整的操作的情况(称作原子性(atomicity)).
DBMS 有两个不同的命令来源:
- 普通用户和应用程序, 他们要求对数据进行访问或修改.
- 数据库管理员(database administrator, DBA), 负责建立数据库的结构或模式的一个人或一组人.
早期的数据库管理系统
早期的数据库管理系统
第一个商用数据库管理系统产生于20世纪60年代末.
这些系统是由文件系统演变而来的. 提供了对上述第3条的部分支持: 文件系统可以长时间地存储数据, 并且允许存储大量的数据.
文件系统相对于数据库管理系统的缺点
- 文件系统对第1条(数据模式)的支持仅限于创建文件的目录结构.
- 文件系统不直接支持第2条, 即针对文件中数据的查询语言.
- 文件系统并不能保证数据不丢失, 如果没有备份的话; 而且它们也不支持对数据项的高效存取, 如果不知道它在特定的文件里的存储位置.
- 文件系统也不满足第5条.
早期DBMS的应用
在 DBMS 最初的重要应用中, 数据由许多小的数据项组成, 对数据有许多查询或修改. 这些应用实例有
- 银行系统, 维护账户和确保系统故障时并不引起钱的丢失.
- 航空公司订票系统, 这些系统就像银行系统一样, 要求确保数据不会丢失, 并且必须能接受顾客大量的小操作.
- 企业记录系统, 雇员和税务记录、财产清单、销售记录和大量的其他类型的信息, 大部分是很关键的.
早期DBMS使用的数据模型
早期的DBMS要求程序员直接面对数据的存储格式. 这些数据库系统用一些不同的数据模型来描述信息在数据库中的结构, 其中主要有“层次型”或基于树的模型以及基于图的“网状”模型.
这些早期的模型和系统不支持高级查询语言.
目前流行的数据库管理系统
目前流行的数据库管理系统
1979年 Ted Codd 发表了一篇著名的论文
Codd, E. F., A relational model for large shared data banks, Comm, ACM, 13:6, pp.377-387, 1970.
数据库系统发生了显著变化.
Codd 认为数据库系统中的数据应该被组织成叫做“关系”的表. 数据库系统的底层应该有一个复杂的数据结构, 允许对各式各样的查询进行快速响应. 另外, 程序员不必关心DBMS内部的存储结构, 查询可以用很高级的语言来表达.
到1990年, 关系数据库系统已经成为标准. 然后数据库领域一直在发展. 面向对象的特性渗入了关系模型. 一些大型数据库已不再使用关系方法组织.
目前流行的数据库管理系统
- MySQL
- PostgreSQL
- SQLite
- Oracle
- Microsoft SQL Server
- IBM DB2
- Sybase
- 等等
课程内容
课程内容
主要学习关系数据库的基础知识. 了解数据库设计的一些知识.
数据库选择 MySQL, SQLite 作为教学.
基本术语
基本术语
- 数据库, Database
- 数据库管理员 Database Administrator, 简称 DBA
- 数据定义语言 Data Definition Language, 简称 DDL
- 数据操纵语言 Data Manipulation Language, 简称 DML
- 元数据 metadata
SQL 举例
解释下面两组语句的区别
SELECT b
FROM R
WHERE a < 10 OR a >= 10;
SELECT b
FROM R;
R
a |
b |
5 |
20 |
10 |
30 |
20 |
40 |
$\ldots$ |
$\ldots$ |
第一组SQL语句意思为, 从关系 R 中找出所有 a 字段非空(即 a!=NULL
) 的元组, 并只取出 b 字段的值.
第二组SQL语句不能排除 a 字段为 NULL
的元组, 它将所有的都列出来.
And how about these?
下面两组语句呢?
SELECT a
FROM R, S
WHERE R.b = S.b;
SELECT a
FROM R
WHERE b IN (SELECT b FROM S);
这两个查询本质上是一样的, 不同之处在于第二个用到了子查询, 不会出现结果中元组重复的问题.
course requirements
实验
项目
What is data model?
什么是数据模型(data model)
数据模型是用于描述数据或信息的标记. 它一般由三部分组成:
- 数据结构(structure of the data)
很多编程语言, 如 C/C++, Java 等, 都有数组、对象等用来描述程序中数据的结构.
- 数据操作(operation on the data)
编程语言中, 在数据上的任何处理都可以称为数据操作.
但在数据库数据模型中, 只能在数据上附加一些有限的可执行的操作集. 如
- 查询(query, 检索信息的操作)
- 修改(modification, 修改数据库操作)
通过这些约束操作, 开发者就有可能在一个较高层次上对数据库操作进行描述, 从而使得数据库管理系统(DBMS)能够更有效地执行这些操作.
- 数据上的约束(constraint on the data)
一些重要的数据模型
数据库系统中两种非常重要而且比较优秀的的数据模型是:
关系数据模型, 包括对象关系模型的扩展
半结构化数据模型, 包括 XML 和相关的标准
关系模型与表
关系模型是一种基于表的数据模型
Beers
name |
manf |
Winterbrew |
Pete's |
Bud Lite |
Anheuser-Busch |
Beers 就是关系名, name 和 manf 是属性名, 每一行称为元组(tuple), 或记录(record).
模式(schemas)
关系模式(relation schema)
关系模式指关系名连同其属性列表.
- 属性类型是可选的.
- 例如: Beers(name,manf) 或者
Beers(name: string, manf: string)
数据库模式(database schema)
指数据库中所有关系的关系模式.
数据库(database)
指一些关系的集合.
Why relations?
为什么使用关系模型?
- 这是非常简单的模型.
- 与我们对数据的思考比较符合.
- 是 SQL 所基于的抽象模型, SQL 是当前最重要的数据库语言.
关系模型在现行的所有商业数据库管理系统中都有出现.
我们使用的例子
Beers(name, manf)
Bars(name, addr, license)
Drinkers(name, addr, phone)
Likes(drinker, beer)
Sells(bar, beer, price)
Frequents(drinker, bar)
上面加下划线的属性(组), 代表这是键(key), 即所有元组在 key 对应的属性(组)上不能取相同的值. 这就是一种约束.
SQL 中的数据库模式
SQL 中的数据库模式
- SQL 是对数据库进行查询和修改操作的语言.
- SQL 也包含了描述数据库模式的数据定义部分(data-defition component).
表中声明的元素
表中声明的元素
大多基本的元素: 属性(attribute)+属性的类型(type).
常用的类型有:
- INT 或 INTEGER, 两者是同义的.
- REAL 或 FLOAT, 两者是同义的.
- CHAR(n), 指含有 $n$ 个字符的固定长度字符串.
- VARCHAR(n), 变长字符串, 最多含 $n$ 个字符.
例子: Create Table
Create Table
CREATE TABLE Sells (
bar CHAR(20),
beer VARCHAR(20),
price REAL
);
SQL Values
SQL Values
- 整数、实数等的表示方法与大多编程语言中一致.
- 字符串(string), 需要用单引号(single quotes)括起来.
- 如:
'Joe'
- 两个连续的单引号等于真正的单引号, 如:
'Joe''s Bar'
- 任何可以为 NULL.
例子
INSERT INTO Sells VALUE('Joe''s Bar', 'Heineken', 3);
SQL 中的日期和时间
Dates and Times
- DATE 和 TIME 是 SQL 中的数据类型.
- 在 CREATE TABLE 语句中可以这样来声明一个属性为 DATE 或 TIME 类型.
BookingDate DATE;
BookingTime TIME;
- date 值形如:
DATE 'yyyy-mm-dd'
- 例如:
DATE '2012-09-04'
表示 2012年9月4日.
- time 值采用 24 小时制, 形如:
TIME 'hh:mm:ss'
- 如果要表示分秒, 则可以在后面加小数点和一个数字
- 例如:
TIME '15:30:02.5'
表示下午 3点30分过两秒半.
- DATETIME
- DATETIME 是 DATE 和 TIME 的组合类型, 形如 "YYYY-MM-DD HH:MM:SS"
- 其值介于 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间.
- TIMESTAMP
- TIMESTAMP形如 "YYYY-MM-DD HH:MM:SS". 存储范围自格林威治时间1970年1月1日午夜0时0分1秒至2038年1月19日3时14分07秒点999999, 即'1970-01-01 00:00:01.000000'到'2038-01-19 03:14:07.999999'.
- 为什么是这个范围, 因为TIMESTAMP使用4个字节存储有符号整数, 数值意义是自1970年1月1日午夜0时0分0秒经过的秒数, 四个字节的有符号整数的表示范围为 -2147483648至2147483647. 而经过的秒数最大是
- 如果要表示分秒, 则可以在后面加小数点和一个数字
- 例如:
TIME '15:30:02.5'
表示下午 3点30分过两秒半.
进一步请参考
https://www.yiibai.com/mysql/time.html
键的声明
键的声明(Declaring keys)
- 某个属性或一组属性可以被声明为 PRIMARY KEY 或 UNIQUE.
- 两种声明都保证该关系中的任意两个元组在定义键的属性(集)上取值不同.
- 这两种声明方式有点区别, 声明为PRIMARY KEY的属性不可以取NULL值, 而UNIQUE可以. 其他将在后面介绍.
Declaring single-attribute keys
单属性主键声明
- 将 PRIMARY KEY 或 UNIQUE 加到属性类型声明的后面.
- 如:
Declaring single-attribute keys
多属性主键声明
- 键的声明也可以作为
CREATE TABLE
中的独立语句, 我们称为独立主键声明.
- 当键由多个属性构成时, 必须使用这种形式. 对于单属性主键也可以这样声明.
- 它的形式是:
-
CREATE TABLE Sells (
bar CHAR(20),
beer VARCHAR(20),
price REAL,
PRIMARY KEY (bar, beer)
);
PRIMARY KEY vs. UNIQUE
PRIMARY KEY vs. UNIQUE
- 关系中仅允许有一个 PRIMARY KEY, 但可以有多个声明为 UNIQUE 的属性.
- 如此前提到, 元组在声明为 PRIMARY KEY 的属性上不允许取 NULL 值, 而声明为 UNIQUE 的属性可以取 NULL 值, 并且关系中可能存在多个元组, 在该属性上取 NULL 值.
Semistructured data
半结构化数据
- 基于树的一种数据模型
- Motivation: 对于数据表示的灵活性;
- Motivation: 系统与数据库之间文档的共享.
Graphs of semistructured data
半结构化数据的图示
- 节点(node)=对象
- 弧上的标签(label)=对象的属性
- 叶子节点(leaf)处的数据是原子类型.
- 灵活性:
- 对于从节点出发的标签没有个数限制.
- 对于给定标签的后继标签个数没有限制.
从节点 $N$ 出发到达节点 $M$ 的弧上的标签 $L$ 可担任下面两个角色之一:
- 可认为 $N$ 表示的是一个对象或实体, 而 $M$ 表示 $N$ 的一个属性, 那么 $L$ 表示该属性的名字.
- 可认为 $N$ 和 $M$ 都是对象或实体, $L$ 就是从 $N$ 到 $M$ 的一个联系的名字.
例子: Data graph
Data graph
XML
XML
- XML= eXtensible Markup Language.
- HTML 使用标签(tags) 进行格式化( e.g. "italic"), 而XML 使用标签表明语义.
Tags
标签(Tags)
- 与HTML中一样, XML中的标签是用尖括号
<...>
括起来的文本. 并且要求开始标签(opening tag) 与结束标签(closing tag)是配对的. 如 <FOO>...</FOO>
. 还允许单一的标签 <FOO />
.
- 一对匹配标签和出现在它们之间的一切内容称为元素.
- 标签可以任意嵌套.
- XML 标签是大小写敏感的.
例子: XML 文档
XML 文档的例子
<?xml version="1.0" encoding="utf-8"?>
<BARS>
<BAR>
<NAME>Joe's Bar</NAME>
<BEER>
<NAME>Bud</NAME>
<PRICE>2.50</PRICE>
</BEER>
<BEER>
<NAME>Miller</NAME>
<PRICE>3.00</PRICE>
</BEER>
</BAR>
<BAR>
...
</BAR>
</BARS>
Attributes
属性(attributes)
- 与HTML一样, XML中的开始标签可以有
attribute=value
对.
- 属性也可以允许在元素间进行连接(后面讨论).
Bars, using attributes
使用属性的 Bars
<?xml version="1.0" encoding="utf-8"?>
<BARS>
<BAR name="Joe's Bar">
<BEER name="Bud" price=2.50 />
<BEER name="Miller" price=3.00 />
</BAR>
<BAR>
...
</BAR>
</BARS>
name 和 price 是 BEER 的属性.
注意 BEER 元素是含有两个属性的单标签.
DTD's (Document Type Definitions)
DTD's (文档类型定义)
- 描述哪些种类的元素可以出现在文档集中, 以及标签如何被嵌套等语法记号.
- 定义的形式如下:
<!DOCTYPE <root tag> [
<!ELEMENT <name> (<components>)>
... more elements ...
]>
例子: DTD
DTD 的例子
<!DOCTYPE BARS[
<!ELEMENT BARS (BAR*)>
<!ELEMENT BAR (NAME, BEER+)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT BEER (NAME, PRICE)>
<!ELEMENT PRICE (#PCDATA)>
]>
- BARS 对象有零个或多个 BAR 子对象嵌套在其中.
- BAR 具有一个 NAME 子对象, 和一个或一个以上的 BEER 子对象.
- BEER 有 NAME 和 PRICE 子对象
- NAME 和 PRICE 是 HTML 文本(#PCDATA 表示解析过的字符数据 "parsed character data".)
- 元素后的 * 号表示该元素可以出现的次数 $\geq 0$;
- 元素后的 + 号表示该元素可以出现的次数 $\geq 1$;
- 元素后的 ? 号表示该元素可以出现的次数 $=0, 1$.
Attributes in XML
XML 中的属性(attributes)
- XML 中的开始标签可以含有属性(attributes).
- 在 DTD 中,
<!ATTLIST E ...>
声明了元素 E 的属性及其数据类型.
例子: Declaring attributes in DTD
DTD 中声明属性
<!ELEMENT BEER EMPTY>
<!ATTLIST name CDATA #REQUIRED,
manf CDATA #IMPLIED>
- 保留字 EMPTY (不加小括号) 指明 BEER 没有结束标签, 即是单标签, 也没有子元素.
- CDATA 表示 character string.
- #REQUIRED 表示该属性必须出现.
- #IMPLIED 表示该属性是可以不出现的.
用法:
<BEER name="Bud" />
End
Thanks very much!
This slide is based on Jeffrey D. Ullman's work, which can be download from his website.