1. 基本概念
-
数据(Data)
信息存在的形式(其实就是表示信息的符号)
-
数据模型(Data Model)
描述数据的一组概念和定义
-
数据模式(Data Schema)
用一种给定的数据模型对特定信息进行描述的结果
如果将数据模型看成一种设计语言,数据模式就是用该语言编写的程序
2. 数据的抽象级别
-
物理模式:描述数据在磁盘上如何存储的
-
逻辑模式(概念模式):数据间逻辑的描述、逻辑结构
-
视图(外模式):用户可见的内容
以关系型数据库为例,逻辑模式就是有多少张表,每张表的属性是什么,这些表称为基表,每一张基表都对应一个存储结构,这就是物理模式,另外针对不同用户,并不是所有基表都可见,所以需要根据业务需求,给不同用户定制不同的视图,这些视图都是根据基表算出来的。
3. 数据独立性
-
数据的逻辑独立性
应用程序都是基于外模式的,当逻辑结构发生改变时,只要改变映射关系,保证外模式视图不变,对应用程序就没有影响
-
数据的物理独立性
类似地,数据物理结构变化时,逻辑模式应该不受影响
4. 关系数据模型
关系数据模型屏蔽了底层技术细节,只有表一种数据结构,可以利用关系代数封闭运算
4.1 基本概念
-
属性(Attributes)
比如学生有学号、姓名、年龄、性别、住址等
-
域(domain)
每一个属性的值域
关系数据模型有空值的概念,注意,既不是零,也不是空串,就是不知道
-
主键
唯一确定表中的一条记录
如果主键的子集也能够唯一确定一条记录,那么该主键叫做超键主键类似于一个线性空间中的极大线性无关组
-
外键
表示对其它表的引用,作为外键的属性是它引用的表的主键,像一个逻辑指针
如果把外键看成逻辑指针,那么它是不允许为空的,它指向的其他表的记录必须存在
在DBMS中,如果明确定义了外键,系统会自动帮我们检查
-
域完整性约束
每个属性的值是否符合其定义域
-
实体完整性约束
主键不允许为空
4.2 Example Instances
sid | bid | day |
---|---|---|
22 | 101 | 10/10/96 |
58 | 103 | 11/12/96 |
bid | bname | color |
---|---|---|
101 | tiger | red |
103 | lion | green |
105 | hero | blue |
sid | sname | rating | age |
---|---|---|---|
22 | dustin | 7 | 45.0 |
31 | lubber | 8 | 55.5 |
58 | rusty | 10 | 35.0 |
sid | sname | rating | age |
---|---|---|---|
28 | yuppy | 9 | 35.0 |
31 | lubber | 8 | 55.5 |
44 | guppy | 5 | 35.0 |
58 | rusty | 10 | 35.0 |
4.3 关系代数的基本操作
关系代数有五个基本操作:
- selection: ,在一个关系里,把满足要求的行找出来
- projection: ,把不需要的列去掉
- cross-product: ,笛卡尔乘积
- set-difference: ,属于关系1,但是不属于关系2的元组
- union: ,属于关系1,或属于关系 2 的元组
这五个操作是一个完备的系统,其他操作都可以由这5个操作导出
4.3.1 Projection
sname | rating |
---|---|
yuppy | 9 |
lubber | 8 |
guppy | 5 |
rusty | 10 |
投影操作要求消除结果中可能出现的重复元组,如下面将表 S2
投影到 age
属性
age |
---|
35.0 |
55.5 |
注意,实际数据库系统默认不会消除重复结果,因为不知道用户要做什么样的开发,所以交给用户来决定,可以主动要求消除重复元组
4.3.2 Selection
sid | sname | rating | age |
---|---|---|---|
28 | yuppy | 9 | 36.0 |
58 | rusty | 10 | 35.0 |
选择操作本身不会产生重复元组
下面是选择操作和投影操作的组合
sname | rating |
---|---|
yuppy | 9 |
rusty | 10 |
4.3.3 二元操作—并、交、叉
这三个操作都有一个共同的要求,参与集合运算的两个关系必须满足并兼容的关系:
- 要拥有相同个数的属性
- 对应属性的类型必须一样
4.3.3.1 并
sid | sname | rating | age |
---|---|---|---|
22 | dustin | 7 | 45.0 |
31 | lubber | 8 | 55.5 |
58 | rusty | 10 | 35.0 |
44 | guppy | 5 | 35.0 |
28 | yuppy | 9 | 35.0 |
4.3.3.2 交
sid | sname | rating | age |
---|---|---|---|
31 | lubber | 8 | 55.5 |
58 | rusty | 10 | 35.0 |
4.3.3.3 差
sid | sname | rating | age |
---|---|---|---|
22 | dustin | 7 | 45.0 |
4.3.4 笛卡尔乘积
sid1 | sname | rating | age | sid2 | bid | day |
---|---|---|---|---|---|---|
22 | dustin | 7 | 45.0 | 22 | 101 | 10/10/96 |
22 | dustin | 7 | 45.0 | 58 | 103 | 11/12/96 |
31 | lubber | 8 | 55.5 | 22 | 101 | 10/10/96 |
31 | lubber | 8 | 55.5 | 58 | 103 | 11/12/96 |
58 | rusty | 10 | 35.0 | 22 | 101 | 10/10/96 |
58 | rusty | 10 | 35.0 | 58 | 103 | 11/12/96 |
这里涉及到对属性重命名的操作,因为两张表都有sid属性
4.4 连接
与实际工作最相关的时基本操作基础上组合出来的连接操作
4.4.1 条件连接
Condition Join:,这里 表示条件,例如:
(sid) | sname | rating | age | (sid) | bid | day |
---|---|---|---|---|---|---|
22 | dustin | 7 | 45.0 | 58 | 103 | 11/12/96 |
31 | lubber | 8 | 55.5 | 58 | 103 | 11/12/96 |
有更高效的方法,这里是方法的定义
4.4.2 等值连接
Equi-Join:条件连接中的 都是等值判断,是条件连接的特殊形式,结果中schema的每组等值的属性会去掉一个
4.4.3 自然连接
Natural Join:所有公共属性上都做等值连接,实际工作最常用
4.5 除法
假设关系 有 个属性 和 , 只有一个属性 :
用基本操作来表示除法的表达式如下:
先求出不满足的 的取值:
再用 的所有 的取值作差,得到的就是满足条件的值:
这里注意,如果关系 的属性 的值为 ,而关系 有元组 ,,,那么 的结果只有,仔细理解定义式,在 中,一个 存在对应的所有 值才会被保留下来
4.6 外连接
-
左外连接
保留左边所有的元组,如果左边有,右边没有,则右边补空值
-
右外连接
保留右边所有的元组,如果右边有,左边没有,则左边补空值
-
全外连接
两边元组全保留,出现一边有一边没有则在对应位置补空值
4.7 外并(Outer Unions)
对并操作的拓展,强行把不满足并兼容条件的关系合并
sid | sname | rating | age | bid | day |
---|---|---|---|---|---|
22 | dustin | 7 | 45.0 | null | null |
31 | lubber | 8 | 55.5 | null | null |
58 | rusty | 10 | 35.0 | null | null |
22 | null | null | null | 101 | 10/10/96 |
58 | null | null | null | 103 | 11/12/96 |
5. 数据库管理系统(DBMS)
- ufi:机器访问接口,类似IPython界面,敲一条命令就能执行了,交互式访问
- API:对外提供的函数接口,程序内访问
6. 事务 transaction
事务是对数据库的操作的集合,这组操作具有下面的一些性质:
-
原子性(Atomic action)
组成一个事务的若干操作,要么全部成功,要么全部失败
-
存储一致性(Consistency preservation)
数据库本来状态是一致的,经过一个事务的运行,数据库达到另外一个一致性
-
隔离性(Isolation)
同时运行的事务互相之间不能干扰
-
持久性(Durability)
一个事务只要成功完成,那么它对数据库产生的影响应该永久反映在数据库里的,哪怕将来出现故障也是可恢复的
传说中的ACID
一个事务有两种结束方式:commit 或 rollback
事务有以下 2 个规则:
-
提交规则
在提交事务之前,修改必须写到硬盘上
-
先记后写规则
如果直接修改数据库的话,必须先对原来数据进行记录
7. 安全性和完整性约束
可能导致数据库中的数据被破坏的因素大致有下面四个:
- 系统崩溃(DBMS恢复机制)
- 并发访问时破坏了存储一致性(DBMS并发控制)
- 人为破坏(数据库安全问题)
- 输入数据库的数据本来就是不正确的(完整性约束问题)
7.1 数据库的安全控制
防止数据库被非法访问,有以下措施
-
利用视图或者查询修改
其实都是限制用户所能看到的内容,避免用户直接看到基表结构
-
访问控制
- 普通用户
- 拥有一定特权的用户
- DBA,超级用户
-
用户识别验证
- 密码
- 特别地识别物,IC卡、钥匙
- 生物信息,指纹、虹膜等
-
授权
grant XXXX······
-
用户组
给一类用户授权同样的权限,避免一个个的授权
-
数据加密
-
审计追踪(Audit trail)
记录操作日志,方便分析事故原因
7.2 数据库的完整性约束
就是一系列合法的关系实例必须满足的条件或规则,违反规则数据是不允许进入数据库的
-
静态约束
-
固有约束
在确定数据模型时,就有的约束,比如 1NF(原子性)
-
隐含约束
数据模式定义里隐含的约束,比如域完整性约束(定义域,比如年龄必须是正整数)、主键约束、外键约束(引用完整性约束)
-
显示约束
通过断言或check子句
-
-
动态约束
当数据库在状态转换过程中,应该满足的约束,一般和触发器相关(DBMS会监控数据库状态,状态转换时触发)
8. 数据库设计
8.1 关系模式的范式理论
-
1 NF:属性不可分
关系里面每个属性必须是原子的
-
2 NF:符合1NF,并且,非主属性完全依赖于主键
满足 1 NF,并且不存在属性对主键的部分函数依赖(例如一般属性由主键的一部分决定,存在部分主键对某些属性没有决定性),如:
学号,姓名,年龄,地址,课程号,成绩
,显然主键是(学号,课程号)
,这里单独根据学号就能一些属性,这就是部分函数依赖应当避免这种部分函数依赖,否则会出现很麻烦的情况,例如学生才开学,没有选课时,基本信息就无法录入
-
3 NF:符合2NF,并且,消除传递依赖
满足 2 NF,并且不存在属性对主键的传递依赖,如:
职工编号,薪水等级,薪水
,主键是职工编号
,这里职工编号
决定了薪水等级
,薪水等级
决定了薪水
,形成了传递依赖例如,已经定好了每一等级对应多少钱,但是员工没定级,这就无法录入数据
还有一种 BCNF 范式,和 3 NF 范式基本相当,比 3 NF 稍微严格,BCNF 中关系模式里属性之间的函数依赖关系里的决定因子必须是主键,这里举一个例子,满足 3 NF 但是不满足 BCNF:
城市,街道,邮政编码
这里主键是城市和街道,它们唯一地决定了一个邮政编码,但是邮政编码又能唯一地决定一个城市
一般设计数据库时到 3 NF 就行
-
4 NF:要求把同一表内的多对多关系删除
-
5 NF:将表分割成尽可能小的块,为了排除在表中所有的冗余
8.2 数据字典和数据流图
统计所有的属性、值域、定义域等······
- 避免命名冲突
- 避免概念冲突
- 避免域冲突
8.3 编码
例如学校适用的数据库,会对院系有一个唯一的编号,这就是编码,可以起到压缩信息的作用
8.4 总结
上面只是一般理论上的设计准则,实际应用中药根据实际的数据情况来,该分表就分表,逆范式化就逆范式化