数据建模即是要设计应用程序如何在给定数据库中存储数据。对于 DynamoDB 等 NoSQL 数据库,数据建模不同于使用关系数据库进行建模。关系数据库旨在实现灵活性,非常适用于分析应用程序。在关系数据建模中,首先要从实体开始。当您具有标准化关系模型后,可以满足应用程序中需要的任何查询模式。
NoSQL(非关系型)数据库旨在提高,扩大规模,而不是为了实现灵活性。尽管关系数据库的性能可能会随着扩展而下降,但是横向扩展 DynamoDB 之类的数据库在任意规模下都能提供一致的性能。某些 DynamoDB 用户的表大于 100TB,这些表的读写性能与表小于 1GB 时并无差别。
要使用 DynamoDB 等 NoSQL 数据库获得最佳效果,需要转变使用典型关系数据库的思维方式。使用 DynamoDB 对数据进行建模时,请使用以下最佳实践。
1.重点关注访问模式
执行任何类型的数据建模时,您都将从一个实体关系图开始,该图描述了应用程序中的不同对象(或实体)及其之间的连接方式(或实体之间的关系)。
在关系数据库中,您要将实体直接放入表中,并使用外键指定关系。定义数据表后,关系数据库提供了一种灵活的查询语言,可以您需要的形状返回数据。
在 DynamoDB 中,您要在对表进行建模之前考虑访问模式。NoSQL 数据库侧重于速度,而不是灵活性。您首先要明白如何访问数据,然后按照数据将被访问的形状对其据进行建模。
在设计 DynamoDB 表之前,记录您在应用程序中读写数据的每项需求。透彻考虑应用程序中的所有流,因为您要针对访问模式优化表。
2.优化对 DynamoDB 的请求数量
记录应用程序的访问模式需求后,就可以开始设计表了。您应为每个访问模式设计一个表,以最大限度地减少对 DynamoDB 的请求数量。理想情况下,每个访问模式应该只需向 DynamoDB 发出一个请求,因为网络请求比较慢,这会限制在应用程序中发出的网络请求数量。
要优化对 DynamoDB 的请求数量,您需要了解一些核心概念:
3.不要伪造关系模型
刚接触 DynamoDB 的用户经常会尝试在非关系数据库 DynamoDB 之上实现关系模型。如果您尝试这样做,会失去 DynamoDB 的大部分优势。
用户使用 DynamoDB 尝试的最常见反模式(对重复出现问题的无效响应)有:
- 标准化:在关系数据库中,您会将数据标准化以减少数据冗余和存储空间,然后使用联接组合多个不同的表。然而,大规模联接不仅速度缓慢,而且成本高昂。DynamoDB 不支持联接,因为联接会随着表的增长而变慢。
- 每个表一个数据类型:DynamoDB 表通常在一个表中包含不同类型的数据。在我们的示例中,单个表中有 User、Game 和 UserGameMapping 实体。在关系数据库中,这将建模为三个不同的表。
- 过多的二级索引:用户经常尝试为自己需要的每个额外访问模式创建一个二级索引。DynamoDB 采用无架构设计,索引同样如此。利用属性中的灵活性在表的多个数据类型中重用单个二级索引。这称为索引重载。
在下面的步骤中,我们将构建实体关系图并预先设计出访问模式。这些应始终是您使用 DynamoDB 的首要步骤。然后,在接下来的模块中,我们将在表设计中实现这些访问模式。
完成模块所需时间:20 分钟