1. Course Overview¶
约 884 个字 35 行代码 预计阅读时间 5 分钟
Definition¶
根据一般定义,数据库指的是一组以某种关系相互关联的数据。我们常说的 MySQL、Oracle、MongoDB、Snowflake 等实际上属于数据库管理系统(Database Management Systems, DBMS),是用来管理数据库的软件。
对于一个音乐软件,如果我们需要为其设计数据库,可以想到把 artist 和 album 放在两个不同的 csv 文件中,当我们执行查询等操作时可以进行逐行解析:
例如,当我们想要查询什么年代 GZA 出道,可以使用如下简单的 python 代码:
众所周知,这种简单的线性扫描并不能带来完整的功能和性能
- data intergrity
- implementation
- durability
- ...
Data Models¶
- Relational
- Key/Value
- Graph
- Document/Object
- Wide-Column/Column-family
- Array/Matrix/Vectors
- Hierarchical
- Network
- Multi-Value
最后三种几乎没有人再使用
本课程主要涉及的数据库建立在关系型模型的基础上,它有如下三点关键:
- Store database in simple data structures (relations).
- Access data through high-level language, DBMS figures out best execution strategy.
- Physical storage left up to the DBMS implementation.
因此,对于 Ralational Model 设计的三个重要概念在于:
- <1> Structure: The defination of the dababase's relations and their contents
- <2> Intergrity: Ensure the database's contents satisfy constraints
- <3> Manipulation: Programming interface for accessing and modifying a database's contents
继续使用我们上一节中的数据,不过这次将其存储在一个 Table(Relation)中:
Name | Year | Country |
---|---|---|
Wu-Tang Clan | 1992 | USA |
Notorious BIG | 1992 | USA |
GZA | 1990 | USA |
对于一个关系,我们需要为其设定一个 Primary Key 作为各个元组的独特标识。在本例中,由于一般情况下 Artist 不会重名,我们可以将 Name 作为主键。
如果不定义主键,一些 DBMS 会自动生成一个内部主键
不过我们不能保证 Artist 的名字不会重复,因此,更好的解决办法是,额外设置一个 ID 字段来作为主键,例如:
ID | Name | Year | Country |
---|---|---|---|
123 | Wu-Tang Clan | 1992 | USA |
456 | Notorious BIG | 1992 | USA |
789 | GZA | 1990 | USA |
除此之外,对于多个关联的 Relation,我们需要维护一个 Foreign Key 来进行类似"映射"的操作。一个最常用的方法是创建一个交叉引用表:
Data Manipulation Languages, DMLs¶
DMLs 是用来从数据库中存取数据的语言,即与数据库交互的方式。它可以分为两类:
- Procedural Method: 对数据库的请求专注于更高层次上对如何查询想要结果的策略
- Relational Algebra
- Non-Procedural (Declarative): 对数据库的请求只指出我们想要的数据,而不是怎么去找到它
- Relational Calculus
Relational Algebra¶
对于关系代数,我们定义以下七个最基本的关系符号,它们的操作数是关系中的元组:
Symbols | Operations |
---|---|
\(\sigma\) | Select |
\(\Pi\) | Projection |
\(\cup\) | Union |
\(\cap\) | Intersection |
- | Difference |
\(\times\) | Product |
\(\bowtie\) | Join |
接下来我们以 \(R(a\_id, b\_id)\) 和 \(S(a\_id, b\_id)\) 两个关系来演示各个操作的效果:
1. Select
语法为:
a_id | b_id |
---|---|
a2 | 103 |
2. Projection
语法:
b_id-100 | a_id |
---|---|
2 | a_2 |
3 | a_3 |
3. Union
语法:
a_id | b_id |
---|---|
a1 | 101 |
a2 | 102 |
a3 | 103 |
a3 | 103 |
a4 | 104 |
a5 | 105 |
4. Intersect
语法:
a_id | b_id |
---|---|
a3 | 103 |
5. Difference
语法:
a_id | b_id |
---|---|
a1 | 101 |
a2 | 102 |
6. Product
语法:
R.a_id | R.b_id | S.a_id | S.b_id |
---|---|---|---|
a1 | 101 | a3 | 103 |
a1 | 101 | a4 | 104 |
a1 | 101 | a5 | 105 |
a2 | 102 | a3 | 103 |
a2 | 102 | a4 | 104 |
a2 | 102 | a5 | 105 |
a3 | 103 | a3 | 103 |
a3 | 103 | a4 | 104 |
a3 | 103 | a5 | 105 |
7. Join
语法:
a_id | b_id |
---|---|
a3 | 103 |