# SQL与NoSQL

在数据库世界中，有两种主要类型的解决方案:SQL和NoSQL—或者关系数据库和非关系数据库。它们的不同之处在于它们的构建方式，它们存储信息的类型，以及它们存储信息的方式。 关系数据库是结构化的，具有预定义的模式，比如存储电话号码和地址的电话簿。非关系型数据库是非结构化的、分布式的，并且有一个动态的模式，就像文件夹，里面保存着从一个人的地址和电话号码到他们的Facebook“赞”和在线购物偏好的所有东西。

## SQL

关系数据库以行和列的形式存储数据。每一行包含关于一个实体的所有信息，列是所有单独的数据点。最流行的关系数据库有MySQL、Oracle、MS SQL Server、SQLite、Postgres、MariaDB等。

## NoSQL

以下是最常见的NoSQL类型:

Key-Value Stores: 数据存储在一组键值对中。“键”是一个属性名，它链接到一个“值”。著名的关键值存储包括Redis，伏地魔和发电机。

文档数据库: 在这些数据库中，数据存储在文档中，而不是表中的行和列，这些文档被分组在一个集合中。每个文档可以有完全不同的结构。文档数据库包括CouchDB和MongoDB。

宽列数据库: 在列数据库中，我们有列族，而不是“表”，列族是行的容器。与关系数据库不同，我们不需要预先知道所有的列，而且每一行不必有相同数量的列。柱状数据库最适合分析大型数据集——比如Cassandra和HBase。

图数据库: 这些数据库用于存储关系最好用图表示的数据。数据以图形结构的形式保存，包含节点(实体)、属性(实体的信息)和线(实体之间的连接)。图形数据库的例子包括Neo4J和InfiniteGraph。

## SQL和NoSQL之间的高级差异

存储: SQL将数据存储在表中，每一行代表一个实体，每一列代表关于该实体的一个数据点;例如，如果我们在一个表中存储一个汽车实体，不同的列可以是“颜色”、“制造”、“型号”等等。

NoSQL数据库具有不同的数据存储模型。主要的是键值、文档、图和列。我们将在下面讨论这些数据库之间的差异。

模式: 在SQL中，每条记录都符合一个固定的模式，这意味着必须在数据输入之前决定和选择列，并且每一行必须有每一列的数据。稍后可以修改模式，但这涉及到修改整个数据库和脱机。

而在NoSQL中，模式是动态的。可以动态地添加列，并且每个“行”(或等效的)不必包含每个“列”的数据。

查询: SQL数据库使用SQL(结构化查询语言)来定义和操作数据，功能非常强大。在NoSQL数据库中，查询集中在一组文档上。有时它也被称为UnQL(非结构化查询语言)。不同的数据库使用UnQL有不同的语法。

可伸缩性: 在大多数情况下，SQL数据库是垂直可伸缩性的，即通过增加硬件的马力(更高的内存、CPU等)，这可能会非常昂贵。可以跨多个服务器扩展关系数据库，但这是一个具有挑战性和耗时的过程。

另一方面，NoSQL数据库是水平可伸缩的，这意味着我们可以很容易地在NoSQL数据库基础设施中添加更多服务器来处理大流量。任何廉价的硬件或云实例都可以承载NoSQL数据库，因此它比垂直扩展要划算得多。许多NoSQL技术也会自动跨服务器分发数据。

可靠性或ACID兼容(原子性、一致性、隔离性、持久性): 绝大多数关系数据库都是ACID兼容的。因此，当涉及到数据可靠性和执行事务的安全保证时，SQL数据库仍然是更好的选择。

大多数NoSQL解决方案为了性能和可伸缩性而牺牲了ACID遵从性。

## SQL VS. NoSQL -使用哪一种?

说到数据库技术，没有放之四海而皆准的解决方案。这就是为什么许多企业同时依赖关系数据库和非关系数据库来满足不同的需求。即使NoSQL数据库因其速度和可伸缩性而越来越受欢迎，仍然有一些情况下，高度结构化的SQL数据库可能会执行得更好;选择正确的技术取决于用例。

### 使用SQL数据库的原因

下面是选择SQL数据库的几个原因:

1. 我们需要确保符合ACID原则。ACID遵从性通过精确规定事务如何与数据库交互来减少异常并保护数据库的完整性。通常，NoSQL数据库为了可伸缩性和处理速度而牺牲了ACID遵从性，但是对于许多电子商务和金融应用程序来说，符合ACID遵从性的数据库仍然是首选。
2. 您的数据是结构化的且不变的。如果您的业务没有大幅增长，这将需要更多的服务器，如果您只处理一致的数据，那么可能没有理由使用设计为支持各种数据类型和高流量的系统。

### 使用NoSQL数据库的原因

当应用程序的所有其他组件都快速无缝时，NoSQL数据库可以防止数据成为瓶颈。大数据为NoSQL数据库的巨大成功做出了贡献，主要是因为它处理数据的方式不同于传统的关系数据库。NoSQL数据库的几个流行的例子是MongoDB、CouchDB、Cassandra和HBase。

1. 存储大量数据，这些数据通常很少或没有结构。NoSQL数据库对我们可以存储在一起的数据类型没有限制，并允许我们根据需要添加不同的新类型。使用基于文档的数据库，您可以将数据存储在一个位置，而不必预先定义数据的“类型”。
2. 充分利用云计算和存储。基于云的存储是一种极好的节省成本的解决方案，但它要求数据能够轻松地分布在多个服务器上，以便进行扩展。在现场或云计算中使用普通的(价格低廉、体积较小的)硬件可以省去额外安装软件的麻烦，而像Cassandra这样的NoSQL数据库被设计成可以在多个数据中心之间即时伸缩，不会带来太多麻烦。
3. 快速发展。NoSQL对于快速开发非常有用，因为它不需要提前准备。如果您正在处理系统的快速迭代，需要频繁地更新数据结构，而不需要在版本之间停机太多，那么关系数据库将降低您的速度。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://vagrant.gitbook.io/grokking-system-design/sql-yu-nosql.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
