数据库原理

1. 基本概念

  • 数据(Data)

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

  • 数据模型(Data Model)

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

  • 数据模式(Data Schema)

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

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

2. 数据的抽象级别

在这里插入图片描述

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

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

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

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

3. 数据独立性

  • 数据的逻辑独立性

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

  • 数据的物理独立性

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

4. 关系数据模型

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

4.1 基本概念

  • 属性(Attributes)

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

  • 域(domain)

    每一个属性的值域

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

  • 主键

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

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

  • 外键

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

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

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

  • 域完整性约束

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

  • 实体完整性约束

    主键不允许为空

4.2 Example Instances

R1
sidbidday
2210110/10/96
5810311/12/96
B1
bidbnamecolor
101tigerred
103liongreen
105heroblue
S1
sidsnameratingage
22dustin745.0
31lubber855.5
58rusty1035.0
S2
sidsnameratingage
28yuppy935.0
31lubber855.5
44guppy535.0
58rusty1035.0

4.3 关系代数的基本操作

关系代数有五个基本操作:

  • selection: σ \sigma σ,在一个关系里,把满足要求的行找出来
  • projection: π \pi π,把不需要的列去掉
  • cross-product: × \times ×,笛卡尔乘积
  • set-difference: − - ,属于关系1,但是不属于关系2的元组
  • union: ∪ \cup ,属于关系1,或属于关系 2 的元组

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

4.3.1 Projection

snamerating
yuppy9
lubber8
guppy5
rusty10

π s n a m e , r a t i n g ( S 2 ) \Large\displaystyle\pi_{sname,rating}(S2) πsname,rating(S2)

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

age
35.0
55.5

π a g e ( S 2 ) \Large\displaystyle\pi_{age}(S2) πage(S2)

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

4.3.2 Selection

sidsnameratingage
28yuppy936.0
58rusty1035.0

σ r a t i n g > 8 ( S 2 ) \Large\displaystyle\sigma_{rating>8}(S2) σrating>8(S2)

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

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

snamerating
yuppy9
rusty10

π s n a m e , r a t i n g ( σ r a t i n g > 8 ( S 2 ) ) \Large\displaystyle\pi_{sname,rating}(\sigma_{rating>8}(S2)) πsname,rating(σrating>8(S2))

4.3.3 二元操作—并、交、叉

这三个操作都有一个共同的要求,参与集合运算的两个关系必须满足并兼容的关系:

  • 要拥有相同个数的属性
  • 对应属性的类型必须一样
4.3.3.1 并
sidsnameratingage
22dustin745.0
31lubber855.5
58rusty1035.0
44guppy535.0
28yuppy935.0

S 1 ∪ S 2 \Large S1 \cup S2 S1S2

4.3.3.2 交
sidsnameratingage
31lubber855.5
58rusty1035.0

S 1 ∩ S 2 \Large S1 \cap S2 S1S2

4.3.3.3 差
sidsnameratingage
22dustin745.0

S 1 − S 2 \Large S1-S2 S1S2

4.3.4 笛卡尔乘积

sid1snameratingagesid2bidday
22dustin745.02210110/10/96
22dustin745.05810311/12/96
31lubber855.52210110/10/96
31lubber855.55810311/12/96
58rusty1035.02210110/10/96
58rusty1035.05810311/12/96

ρ ( C ( 1 → s i d 1 , 5 → s i d 2 ) , S 1 × S 2 ) \large\displaystyle\rho(C(1\rightarrow sid1, 5\rightarrow sid2),S1\times S2) ρ(C(1sid1,5sid2),S1×S2)

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

4.4 连接

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

4.4.1 条件连接

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

(sid)snameratingage(sid)bidday
22dustin745.05810311/12/96
31lubber855.55810311/12/96

S 1 ⋈ S 1. s i d < R 1. s i d R 1 \Large\displaystyle S1 \bowtie _{S1.sid<R1.sid}R1 S1S1.sid<R1.sidR1

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

4.4.2 等值连接

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

4.4.3 自然连接

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

4.5 除法

假设关系 A A A 2 2 2 个属性 x x x y y y B B B 只有一个属性 y y y

A / B = { ⟨ x ⟩ ∣ ∃ ⟨ x , y ⟩ ∈ A , ∀ ⟨ y ⟩ ∈ B } \Large\displaystyle A/B=\{\langle x\rangle|\exist \langle x,y\rangle\in A,\forall \langle y \rangle \in B\} A/B={xx,yAyB}

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

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

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

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

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

这里注意,如果关系 B B B 的属性 y y y 的值为 y 1 , y 2 y_1,y_2 y1,y2,而关系 A A A 有元组 ⟨ x 1 , y 1 ⟩ \langle x_1,y_1 \rangle x1,y1 ⟨ x 1 , y 2 ⟩ \langle x_1,y_2 \rangle x1,y2 ⟨ x 2 , y 1 ⟩ \langle x_2,y_1 \rangle x2,y1,那么 A / B A/B A/B 的结果只有 x 1 x_1 x1,仔细理解定义式,在 A A A 中,一个 x x x 存在对应的所有 y y y 值才会被保留下来

4.6 外连接

  • 左外连接 ∗ ⋈ *\bowtie

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

  • 右外连接 ⋈ ∗ \bowtie*

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

  • 全外连接 ∗ ⋈ ∗ *\bowtie*

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

4.7 外并(Outer Unions)

对并操作的拓展,强行把不满足并兼容条件的关系合并

sidsnameratingagebidday
22dustin745.0nullnull
31lubber855.5nullnull
58rusty1035.0nullnull
22nullnullnull10110/10/96
58nullnullnull10311/12/96

S 1 ∪ ‾ R 1 \Large\displaystyle S1\underline{\cup} R1 S1R1

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 总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值