注: 本文首发我的 b 站专栏文章CMU 15-445/645-笔记-01-课程简介与关系模型
- 课程目标
- 参考书推荐用 《Database System Concepts》
- 该课程主要是手写 Database Storage Manager 而不是 Database System(因为项目不支持 SQL 解析)
数据库拓展研究
用 CSV(Comma-Seperated Value)文件存 database
怎么用呢,举个例子
但这种方式是有问题的
- 每个专辑的 entry 中的 artist 都是一样的么?
- Ice Cube 没有拼写错误?
- 如果别人在文件里重写了一个无效的 string 怎么办呢?
- 如果一张专辑里面有多个 artist,那么怎么存储这些数据呢?
- 如何查询数据?
- 多线程同一时间写同一个文件怎么办?
- 如何保证数据安全(在写数据的时候机器故障咋办?)
Database Management System 的作用
1970 年 Ted Codd 提出的关系型模型(Relational Model)是为了解决之前数据库不断重构数据结构,以及数据结构转存之后不断销毁数据的问题
- 关系模型三板斧如下
- 用简单数据结构存数据
- 用高级语言访问数据
- 大型数据库的物理存储策略基于 Database Management System 的实现
- 这种思想把 逻辑层 和 物理层 完全解耦
关系型数据模型并不是唯一的数据模型
比如如下
- Relational(MySQL, PostgreSQL,Oracle,DB2,SQL server,SQLite)
- Key/Value,Graph,Document, Column-family(NoSQL)
- Array/Matrix(Mathine Learning)
- Hierarchical,Network (Obsolete / Rare)旧时代的余晖。。。
关系型模型可以对任何东西进行建模
关系型模型主要关注三个方面
一个 关系(relation) 是一个无序的集合,这个集合包含代表 entities 的属性的关系(relationship),比如
tuple 在 关系 中就是一个 属性值 的集合
原始关系模型中,所有的值必须保证原子性或者它必须是一个单个属性值(比如只能是一个 String,一个 int,或者一个 float等,不能是数组或者嵌套的对象等)
- NULL 这个属性值代表未知,SQL 查询会遇到麻烦
- 主键 Primary Key,唯一标识记录的 id
- 外键 Foreign Key,用于指定一张表中的属性必须存在于另一张表中
- 注意 relation 和 table 语义一样
一个外键的例子
如何从 Database 中取数据?
通过 DML (Data Manipulation Languages)
- Relational Algebra 关系代数
Ted Codd 提出了在 Relational Algebra 中的其中基本运算符
SELECT
PROJECTION
即 SELECT b_id-100, a_id FROM R WHERE a_id=’2’UNION
INTERSECTION
DIFFERENCE
PRODUCT
JOIN
即 SELECT * FROM R NATURAL JOIN S;
一些后续研究的额外的操作符
一些优化策略
关系型模型与任何查询语言的实现无关,实际上当 Ted Codd 在他写关系型模型论文时并没有提出 SQL,他提出了 关系代数,并推出了自己的语言叫 Alpha,与(1970)同年推出的 SQL、Ingres (伯克利)、Quel 都是竞争对手。
SQL 只是一个标准
结论