

# 在关系（SQL）和 NoSQL 之间进行选择
<a name="SQLtoNoSQL.WhyDynamoDB"></a>

如今，应用程序的要求比以往更严苛。例如，在线游戏一开始时只有几个用户和极少数据。但是，如果游戏获得成功，则可以轻松超过基础数据库管理系统的资源。基于 Web 的应用程序拥有数百、数千或数百万并发用户，并且每天生成数 TB 或更多新数据，这并不少见。此类应用程序的数据库必须每秒处理数万或数十万次读取和写入。

Amazon DynamoDB 非常适合这些类型的工作负载。作为开发人员，您首先可以使用较低的使用率，然后随着应用程序变得越来越受欢迎而逐渐增加使用率。DynamoDB 无缝扩展以处理大量数据和大量用户。

有关传统关系数据库建模以及如何使其适用于 DynamoDB 的更多信息，请参阅[在 DynamoDB 中建模关系数据的最佳实践](bp-relational-modeling.md)。

下表显示了关系数据库管理系统（RDBMS）和 DynamoDB 之间的一些高级差异。


****  

| 特征 | 关系数据库管理系统（RDBMS） | Amazon DynamoDB | 
| --- | --- | --- | 
| 最佳工作负载 | 临时查询；数据仓库；OLAP (联机分析处理)。 | Web 规模级应用程序，包括社交网络、游戏、媒体共享和物联网 (IoT)。 | 
| 数据模型 | 关系模型需要一个明确定义的架构，其中，数据将标准化为表、列和行。此外，在表、列、索引和其他数据库元素之间定义所有关系。 | DynamoDB 无架构。每个表必须具有一个用来唯一标识每个数据项目的主键，但对其他非键属性没有类似的约束。DynamoDB 可以管理结构化或半结构化数据，包括 JSON 文档。 | 
| 数据访问 | SQL 是存储和检索数据的标准。关系数据库提供一组丰富的工具来简化数据库驱动型应用程序的开发，但所有这些工具都使用 SQL。 | 您可以使用 AWS 管理控制台、AWS CLI 或 NoSQL WorkBench 来操作 DynamoDB 并执行临时任务。[PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) 是一种与 SQL 兼容的查询语言，它使您能够在 DynamoDB 中选择、插入、更新和输出数据。应用程序可以使用 AWS 开发工具包 (SDK)，通过基于对象的、以文档为中心的或低级别的接口来操作 DynamoDB。 | 
| 性能： | 关系数据库已针对存储进行优化，因此，性能通常取决于磁盘子系统。开发人员和数据库管理员必须优化查询、索引和表结构以实现最高性能。 | DynamoDB 已针对计算进行优化，因此，性能主要取决于基础硬件和网络延迟。作为一项托管服务，DynamoDB 可使您和您的应用程序免受这些实施详细信息的影响，以便您能够专注于设计和构建可靠的、高性能的应用程序。 | 
| 扩展 | 利用更快的硬件进行向上扩展是最轻松的。此外，数据库表可以跨越分布式系统中的多个主机，只不过这需要额外的投资。关系数据库设定了文件数和文件大小的最大值，这将对可扩展性施加上限。 | DynamoDB 设计为使用硬件的分布式集群来向外扩展。此设计可提高吞吐量而不会增加延迟。客户指定其吞吐量要求，DynamoDB 会分配足够的资源来满足这些要求。对于每个表的项目数和表的总大小都不施加上限。 | 