# 关系数据库

> 原文：[Relational Databases](https://www.bookbookmark.ds100.org/ch/09/sql_rdbms.html)
> 
> 校验：[Kitty Du](https://github.com/miaoxiaozui2017)
> 
> 自豪地采用[谷歌翻译](https://translate.google.cn/)

```python
# HIDDEN
# Clear previously defined variables
%reset -f

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

```

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

考虑下面的`purchases`关系：

<header style="text-align:center">**purchases**</header>

| **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 |

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

关系的 *模式(schema)* 包含其列名、数据类型和约束。例如，`purchases`表的模式说明列是`name`、`product`、`retailer`和`date purchased`；它还说明每个列都包含文本。

以下`prices`关系显示了一些零售商店中某些小物件的价格：

<header style="text-align:center">**prices**</header>

| **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 |

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

## 关系数据库管理系统[](#Relational-Database-Management-Systems)

关系数据库可以简单地描述为一组包含单个数据项行的表。关系数据库管理系统（RDBMSs）提供了到关系数据库的接口。[Oracle](https://www.wikiwand.com/en/Oracle_Database)、[MySQL](https://www.wikiwand.com/en/MySQL)和[PostgreSQL](https://www.wikiwand.com/en/PostgreSQL)是目前实践中最常用的三种 RDBMS。

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

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

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

## RDBMS 与 pandas 的对比[](#RDBMS-vs-pandas)

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