CMU 15-445 Lecture 1 关系模型和关系代数运算

1,556 阅读2分钟

2022 的 15-445 开始了,利用周末的时间学习一下,本专栏应该是 lecture、project、homework 都会记录,希望一年内能把整个课程做完,lecture 部分并不全面,只挑了些我认为的重点记录。

课程资料

课件笔记项目

数据模型

关系型数据库用的最多,使用的是关系模型。除了关系型数据库外,还有 NoSQL 数据库,使用键值模型、图模型、文档模型、列簇模型;机器学习数据库,使用数组/矩阵模型。

关系模型

定义 RelationRelation 为: R(id,name,year)R(id, name, year)TuplesTuples 为: {T(1,Alice,1992),T(2,Bob,1996)}\{T(1, Alice, 1992), T(2, Bob, 1996)\}

定义 SchemaSchema{Relation,Tuples}\{Relation, Tuples\},如此 SchemaSchema 可以用一张表来描述。

idnameyear
1Alice1992
2Bob1996

DML

DML,数据操作语句,用于数据库中存储和检索数据,分为命令式和声明式。

命令式

命令式 DML 基于关系代数运算,每种运算有一或多个关系模型作为输入,输出新的关系模型。运算类型和符号语言如下。

RSR \cup S

RSR \cap S

RSR - S

R×SR \times S

链接

RSR \bowtie S

选择

σpredicateR\sigma_{predicate}R

投影

πA1,A2,...,AnR\pi_{A_1,A_2,...,A_n}R

不同的关系运算可能得到相同的结果,例如 Rσid=0(S)R \bowtie \sigma_{id=0}(S)σid=0(RS)\sigma_{id=0}(R \bowtie S),但是前者的计算速度更快。

声明式

使用命令式 DML,可能需要开发者思考写出性能搞好的语句,这比较麻烦。可以使用更高级的语句,只声明最后需要的结果,而不去关心如何计算。SQL 就是声明式,与命令式可以互相转换。

声明式命令式
SELCT * FROM R UNION ALL SELCT * FROM S;RSR \cup S
SELCT * FROM R INTERSECT SELCT * FROM S;RSR \cap S
SELCT * FROM R EXCEPT SELCT * FROM S;RSR - S
SELCT * FROM R CROSS JOIN S;R×SR \times S
SELCT * FROM R NATURAL JOIN S;RSR \bowtie S
SELECT * FROM R WHERE id=0;σid=0R\sigma_{id=0}R
SELECT id+1, FROM R WHERE id=0;πid+1R\pi_{id+1}R

课程实验

完成 Project0,实现一个并发安全的字典树,主要是通过这个 Project 学习一下 C++ 使用。