数据库原理

时间:2024-04-01 20:16:17

1. 基本概念

  • 数据(Data)

    信息存在的形式(其实就是表示信息的符号)

  • 数据模型(Data Model)

    描述数据的一组概念和定义

  • 数据模式(Data Schema)

    用一种给定的数据模型对特定信息进行描述的结果

    如果将数据模型看成一种设计语言,数据模式就是用该语言编写的程序

2. 数据的抽象级别

数据库原理

  • 物理模式:描述数据在磁盘上如何存储的

  • 逻辑模式(概念模式):数据间逻辑的描述、逻辑结构

  • 视图(外模式):用户可见的内容

以关系型数据库为例,逻辑模式就是有多少张表,每张表的属性是什么,这些表称为基表,每一张基表都对应一个存储结构,这就是物理模式,另外针对不同用户,并不是所有基表都可见,所以需要根据业务需求,给不同用户定制不同的视图,这些视图都是根据基表算出来的。

3. 数据独立性

  • 数据的逻辑独立性

    应用程序都是基于外模式的,当逻辑结构发生改变时,只要改变映射关系,保证外模式视图不变,对应用程序就没有影响

  • 数据的物理独立性

    类似地,数据物理结构变化时,逻辑模式应该不受影响

4. 关系数据模型

关系数据模型屏蔽了底层技术细节,只有表一种数据结构,可以利用关系代数封闭运算

4.1 基本概念

  • 属性(Attributes)

    比如学生有学号、姓名、年龄、性别、住址等

  • 域(domain)

    每一个属性的值域

关系数据模型有空值的概念,注意,既不是零,也不是空串,就是不知道

  • 主键

    唯一确定表中的一条记录
    如果主键的子集也能够唯一确定一条记录,那么该主键叫做超键

    主键类似于一个线性空间中的极大线性无关组

  • 外键

    表示对其它表的引用,作为外键的属性是它引用的表的主键,像一个逻辑指针

    如果把外键看成逻辑指针,那么它是不允许为空的,它指向的其他表的记录必须存在

    在DBMS中,如果明确定义了外键,系统会自动帮我们检查

  • 域完整性约束

    每个属性的值是否符合其定义域

  • 实体完整性约束

    主键不允许为空

4.2 Example Instances

R1
sid bid day
22 101 10/10/96
58 103 11/12/96
B1
bid bname color
101 tiger red
103 lion green
105 hero blue
S1
sid sname rating age
22 dustin 7 45.0
31 lubber 8 55.5
58 rusty 10 35.0
S2
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: σ\sigma,在一个关系里,把满足要求的行找出来
  • projection: π\pi,把不需要的列去掉
  • cross-product: ×\times,笛卡尔乘积
  • set-difference: -,属于关系1,但是不属于关系2的元组
  • union: \cup,属于关系1,或属于关系 2 的元组

这五个操作是一个完备的系统,其他操作都可以由这5个操作导出

4.3.1 Projection

sname rating
yuppy 9
lubber 8
guppy 5
rusty 10

πsname,rating(S2)\Large\displaystyle\pi_{sname,rating}(S2)

投影操作要求消除结果中可能出现的重复元组,如下面将表 S2 投影到 age属性

age
35.0
55.5

πage(S2)\Large\displaystyle\pi_{age}(S2)

注意,实际数据库系统默认不会消除重复结果,因为不知道用户要做什么样的开发,所以交给用户来决定,可以主动要求消除重复元组

4.3.2 Selection

sid sname rating age
28 yuppy 9 36.0
58 rusty 10 35.0

σrating>8(S2)\Large\displaystyle\sigma_{rating>8}(S2)

选择操作本身不会产生重复元组

下面是选择操作和投影操作的组合

sname rating
yuppy 9
rusty 10

πsname,rating(σrating>8(S2))\Large\displaystyle\pi_{sname,rating}(\sigma_{rating>8}(S2))

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

S1S2\Large S1 \cup S2

4.3.3.2 交

sid sname rating age
31 lubber 8 55.5
58 rusty 10 35.0

S1S2\Large S1 \cap S2

4.3.3.3 差

sid sname rating age
22 dustin 7 45.0

S1S2\Large S1-S2

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

ρ(C(1sid1,5sid2),S1×S2)\large\displaystyle\rho(C(1\rightarrow sid1, 5\rightarrow sid2),S1\times S2)

这里涉及到对属性重命名的操作,因为两张表都有sid属性

4.4 连接

与实际工作最相关的时基本操作基础上组合出来的连接操作

4.4.1 条件连接

Condition JoinRCS=σC(R×S)\displaystyle R\bowtie_{C}S=\sigma_{C}(R\times S),这里 CC 表示条件,例如:

(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

S1S1.sid<R1.sidR1\Large\displaystyle S1 \bowtie _{S1.sid<R1.sid}R1

有更高效的方法,这里是方法的定义

4.4.2 等值连接

Equi-Join:条件连接中的 CC 都是等值判断,是条件连接的特殊形式,结果中schema的每组等值的属性会去掉一个

4.4.3 自然连接

Natural Join:所有公共属性上都做等值连接,实际工作最常用

4.5 除法

假设关系 AA22 个属性 xxyyBB 只有一个属性 yy

A/B={xx,yAyB}\Large\displaystyle A/B=\{\langle x\rangle|\exist \langle x,y\rangle\in A,\forall \langle y \rangle \in B\}

用基本操作来表示除法的表达式如下:

先求出不满足的 xx 的取值:

πx((πx(A)×B)A)\Large\displaystyle \pi_{x}((\pi_{x}(A)\times B)-A)

再用 AA 的所有xx 的取值作差,得到的就是满足条件的值:

πx(A)πx((πx(A)×B)A)\Large\displaystyle \pi_{x}(A)-\pi_{x}((\pi_{x}(A)\times B)-A)

这里注意,如果关系 BB 的属性 yy 的值为 y1,y2y_1,y_2,而关系 AA 有元组 x1,y1\langle x_1,y_1 \ranglex1,y2\langle x_1,y_2 \ranglex2,y1\langle x_2,y_1 \rangle,那么A/BA/B 的结果只有x1x_1,仔细理解定义式,在 AA 中,一个 xx 存在对应的所有 yy 值才会被保留下来

4.6 外连接

  • 左外连接 *\bowtie

    保留左边所有的元组,如果左边有,右边没有,则右边补空值

  • 右外连接 \bowtie*

    保留右边所有的元组,如果右边有,左边没有,则左边补空值

  • 全外连接 *\bowtie*

    两边元组全保留,出现一边有一边没有则在对应位置补空值

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

S1R1\Large\displaystyle S1\underline{\cup} R1

5. 数据库管理系统(DBMS)

数据库原理

DBMS核心的构成
  • ufi:机器访问接口,类似IPython界面,敲一条命令就能执行了,交互式访问
  • API:对外提供的函数接口,程序内访问

6. 事务 transaction

事务是对数据库的操作的集合,这组操作具有下面的一些性质:

  • 原子性(Atomic action)

    组成一个事务的若干操作,要么全部成功,要么全部失败

  • 存储一致性(Consistency preservation)

    数据库本来状态是一致的,经过一个事务的运行,数据库达到另外一个一致性

  • 隔离性(Isolation)

    同时运行的事务互相之间不能干扰

  • 持久性(Durability)

    一个事务只要成功完成,那么它对数据库产生的影响应该永久反映在数据库里的,哪怕将来出现故障也是可恢复的

传说中的ACID

一个事务有两种结束方式:commitrollback

事务有以下 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 总结

上面只是一般理论上的设计准则,实际应用中药根据实际的数据情况来,该分表就分表,逆范式化就逆范式化