9.1.md 4.3 KB
Newer Older
W
wizardforcel 已提交
1
# 关系数据库
W
wizardforcel 已提交
2

W
wizardforcel 已提交
3 4 5 6 7
> 原文:[Relational Databases](https://www.bookbookmark.ds100.org/ch/09/sql_rdbms.html)
> 
> 校验:[Kitty Du](https://github.com/miaoxiaozui2017)
> 
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
W
wizardforcel 已提交
8

K
Kitty Du 已提交
9
```python
W
wizardforcel 已提交
10 11 12 13 14 15 16 17 18 19
# HIDDEN
# Clear previously defined variables
%reset -f

# Set directory for data loading to work properly
import os
os.chdir(os.path.expanduser('~/notebooks/09'))

```

K
Kitty Du 已提交
20
**数据库**是有组织的数据集合。过去,数据存储在专门为特定任务设计的数据结构中。例如,航空公司记录航班预定的格式可能不同于银行管理账户分类账的格式。1969 年,Ted Codd 将关系模型作为一种存储数据的通用方法引入。数据存储在被称为**关系(relations)** 的二维表中,由每行中的单个观察值(通常称为**元组(tuples)** )组成。每个元组都是一个结构化数据项,表示某些**属性(attributes)**(列) 之间的关系。关系的每个属性都有一个名称和数据类型。
W
wizardforcel 已提交
21 22 23

考虑下面的`purchases`关系:

K
Kitty Du 已提交
24
<header style="text-align:center">**purchases**</header>
W
wizardforcel 已提交
25

K
Kitty Du 已提交
26 27 28 29 30
| **name** | **product** | **retailer** | **data purchased** |
| --: | --: | --: | --:|
| Samantha | iPod | Best Buy | June 3,2016 |
| Timothy | Chromebook | Amazon | July 8,2016 |
| Jason | Surface Pro | Target | October 2,2016 |
W
wizardforcel 已提交
31 32 33

`purchases`中,每个元组表示`name``product``retailer``date purchased`属性之间的关系。

K
Kitty Du 已提交
34
关系的 *模式(schema)* 包含其列名、数据类型和约束。例如,`purchases`表的模式说明列是`name``product``retailer``date purchased`;它还说明每个列都包含文本。
W
wizardforcel 已提交
35

K
Kitty Du 已提交
36
以下`prices`关系显示了一些零售商店中某些小物件的价格:
W
wizardforcel 已提交
37

K
Kitty Du 已提交
38
<header style="text-align:center">**prices**</header>
W
wizardforcel 已提交
39

K
Kitty Du 已提交
40 41 42 43 44 45 46 47 48 49 50
| **retailer** | **product** | **price** |
| --: | --: | --: |
| Best Buy | Galaxy S9 | 719.00 |
| Best Buy | iPod | 200.00 |
| Amazon | iPad | 450.00 |
| Amazon | Battery pack | 24.87 |
| Amazon | Chromebook | 249.99 |
| Target | iPod | 215.00 |
| Target | Surface Pro | 799.00 |
| Target | Google Pixel 2 | 659.00 |
| Walmart | Chromebook | 238.79 |
W
wizardforcel 已提交
51

K
Kitty Du 已提交
52
然后,我们可以同时参考这两个表来确定 Samantha、Timothy 和 Jason 为各自的小物件支付了多少钱(假设每家店的价格随时间保持不变)。这两个表一起构成了一个**关系数据库(relational database)** ,它是一个或多个关系的集合。整个数据库的模式是数据库中各个关系的模式集。
W
wizardforcel 已提交
53

K
Kitty Du 已提交
54
## 关系数据库管理系统[](#Relational-Database-Management-Systems)
W
wizardforcel 已提交
55

K
Kitty Du 已提交
56
关系数据库可以简单地描述为一组包含单个数据项行的表。关系数据库管理系统(RDBMSs)提供了到关系数据库的接口。[Oracle](https://www.wikiwand.com/en/Oracle_Database)[MySQL](https://www.wikiwand.com/en/MySQL)[PostgreSQL](https://www.wikiwand.com/en/PostgreSQL)是目前实践中最常用的三种 RDBMS。
W
wizardforcel 已提交
57 58 59 60 61 62

关系数据库管理系统使用户能够添加、编辑和删除数据库中的数据。与使用文本文件集合存储数据相比,这些系统提供了几个关键好处,包括:

1.  可靠的数据存储:RDBMS 保护数据不受系统故障或崩溃的影响。
2.  性能:RDBMS 通常比文本文件更高效地存储数据,并且拥有完善的查询数据的算法。
3.  数据管理:RDBMSS 实现访问控制,防止未经授权的用户访问敏感数据集。
K
Kitty Du 已提交
63
4.  数据一致性:RDBMSS 可以对输入的数据施加约束,例如,列`GPA`只包含介于 0.0 和 4.0 之间的浮点数。
W
wizardforcel 已提交
64 65 66

为了处理存储在 RDBMS 中的数据,我们使用 SQL 编程语言。

K
Kitty Du 已提交
67
## RDBMS 与 pandas 的对比[](#RDBMS-vs-pandas)
W
wizardforcel 已提交
68

K
Kitty Du 已提交
69
RDBMS 和 `pandas` Python 包有何区别?首先,`pandas`不关心数据存储。虽然 数据帧(DataFrame) 可以从多种数据格式中读写,但 `pandas` 并不像 RDBMS 那样规定数据实际存储在底层计算机上的方式。其次,`pandas` 主要提供操作数据的方法,而 RDBMS 同时处理数据存储和数据操作,使它们更适合于较大的数据集。一个典型的经验法则是对大于几 GB 的数据集使用 RDBMS。最后,`pandas` 需要了解 Python 才能使用,而 RDBMS 需要了解 SQL。由于 SQL 比 Python 学习起来简单,RDBMS 允许用户使用较少的技术就能存储和查询数据,这是一个方便的特性。