CMU15445 Lecture 1 Relational Model
数据库的定义
- 由一些互相有联系的数据所组成的集合,该集合模拟了现实世界的某些方面
- 并且数据是大多数计算机应用的组件核心
为什么需要database,也就是一般的文件系统为什么不行flat flie strawman
现在假设需要存储管理一个数字音乐商店,我们需要存储管理以下数据:
Artists的信息- Artists发行的
Albums信息
现在把数据存入CSV(comma-separated value)文件中,并且每一个实体一个单独的文件,应用必须解析文件每当它想要读/更新数据,比如,我们这样存储
Artist:
"Wu-Tang Clan",1992,"USA"
"Notorious BIG",1992,"USA"
"Ice Cube",1989,"USA"
Album:
"Enter the Wu-Tang","Wu-Tang Clan",1993
"St.Ides Mix Tape","Wu-Tang Clan",1994
"AmeriKKKa's Most Wanted","Ice Cube",1990
如果我们需要查找是哪一年Ice Cube单飞了,我们需要这样写一个python脚本:
for line in file.readlines():
record = parse(line)
if "Ice Cube" == record[0]:
print(int(record[1]))
csv文件的缺陷:
- 数据的完整性难以保障
- 如何确保一位artist的每个album的artist字段是一致的
- 如何处理在album发行年份写的不是数字的情况
- 一张album由多个artist发行怎么办
- 如果误删了在Album中还存在album的artist,怎么办
- 实现方面也存在问题
- 如何找到应用所期望的记录条目呢,用python(其他语言也是)效率低
- 如果一个新的应用想要去用同样的数据呢,在它的实现代码中再写一遍查询吗?
- 难以保证线程安全,如果两个线程同时写一个文件,怎么办
- 持久性问题
- 如果在我们更新一条记录是,机器宕机了,怎么办
- 如何复制多个数据库到多台机器上,以达到
高可用呢
数据库管理系统(DBMS)的引入
DBMS是一个软件,使得应用去存储与分析信息在一个database中。DBMS一般是设计用于定义,创建,查询,更新,管理database
由于逻辑层与物理层的紧耦合,早期的数据库应用程序难以构建与维持,在构建一个应用与部署对应的数据库之前,需要大致知道该应用将执行怎样的查询
Ted Codd对此问题,提出了DBMS的抽象:
- 用简单,统一的数据结构存储数据
- 通过高级语言操作数据
- 物理层与逻辑层分离,系统开发者只关心逻辑层,而DBMS的开发者关心物理层
数据模型data model
data model构成了database的基本结构:一个用于描述数据,数据关系,数据语义与一致性约束的概念工具的集合,比如:
Relational,用一个table的集合来表示数据与数据间的关系,每个table有很多的列,每个列有一个唯一的名字,table也被称作relation,该数据模型被广泛使用在当经的数据库系统中Key/Value,比如redisArray / Matrix,机器学习常用Entity-Relationship, E-R图被广泛用于数据库设计Semi-structured, 对于同种数据类型,可以有不同的属性,比如JSON与XMLObject-Based, 由面向对象编程引出该数据模型,可以看作Relational的一种延申,具有封装,方法,对象实体等概念。之前的数据库系统可以将procedure存储并重新执行,就是视图view了
Schema
data model与schema的区别:比如,对于relational model,schema是指表的列有哪些属性?而data model表示用table来表示这些数据与数据间的关系

Relational Model
relaitonal model定义了三个概念:
structure,定义了关系的列的有哪些属性,以及这些属性可以有哪些值Intergrity,用于确保数据库的数据满足一定约束, 比如某个属性必须是数字Manipulation,用来定义应当怎样访问数据库的内容
relation
一个realtion是一个无序集合,它包含了一些属性之间的关系,由这些有着内在联系的属性来表示一个实体,DBMS可以对这个无序集合做排序,用于优化。有n个属性的realtion被叫做n-ary relation
tuple
是relation中的元素,属性的值以前必须得是原子的,单一标量的,现在可以是嵌套的了,也可以是一个列表。每个属性由一个特殊的值NULL,用来表示此时该属性还未定义。
primary key
primary key 在一个 Relation 中唯一确定一个 tuple,如果你不指定,有些 DBMSs 会自动帮你生成 primary key。
foreign key
foreign key 唯一确定另一个 relation 中的一个 tuple,由foreign key可以解决album与artist的1对多的问题
DMLs(Data Manipulation Languages)
用于对于数据库存储或者取数据的语言,主要由两种:过程式Procedural,比如Relational Algebra,与声明式Non-Procedural,比如Relational Calculus
Relational Algebra
关系代数用于在一个realtion中取和操作tuple

注意:关系代数是一种过程式的语言,因为它定义了一个查询的具体执行步骤,比如
已经说明需要先取R与S的交,再做select,而
恰恰相反,它们的结果是一样的,但是它们的效率不同。
SQL是关系模型数据库查询的一个事实上(facto)的标准,它做的便是你告诉它你想要的数据,DBMS决定如何取数据

浙公网安备 33010602011771号