Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)

管理多对多关系的最佳实践

相邻列表是一种设计模式,有助于在 Amazon DynamoDB 中为多对多关系建模。一般地说,它们提供在 DynamoDB 中表示图表数据 (节点和边缘) 的方式。

相邻列表设计模式

当应用程序的不同实体之间具有多对多关系时,此关系可建模为相邻列表。在此模式中,所有顶级实体 (与图表模型中的节点同义) 都是使用分区键表示的。通过将排序键的值设置为目标实体 ID (目标节点),与其他实体 (图表中的边缘) 的任何关系都将表示为分区内的项目。

此模式的优势包括数据重复率最低和精简的查询模式 ,以便查找与目标实体 (让边缘作为目标节点) 相关的所有实体 (节点)。

此模式有用的一个真实示例是包含多个账单的开票系统。一个账单可以属于多个发票。此示例中的分区键为 InvoiceIDBillIDBillID 分区的所有属性都特定于账单。InvoiceID 分区具有存储发票特定属性的项目以及汇总到发票的每个 BillID 的项目。

此架构看上去与下类似:

记账相邻列表的表架构示例。

通过使用上述架构,可看到可以使用表上的主键查询发票的所有账单。要查找包含账单一部分的所有发票,请针对表的排序键创建全局二级索引。此全局二级索引的投影看上去与下类似:

记账相邻列表的 GSI 投影示例。

具体化图表模式

很多应用程序都建立在对跨对等排名、实体间关系、相邻实体状态和其他类型的图表样式工作流的了解上。对于这些类型的应用程序,请考虑以下架构设计模式:


        1 号图表示例。

        2 号图表示例。

        3 号图表示例。

前述架构显示的是通过一组数据分区(包含定义图表边缘和节点的项)定义的图表数据结构。边缘项目包含 TargetType 属性。这些属性用作复合键名称“TypeTarget”的一部分,用于标识主表分区或第二个全局二级索引中的项目。

第一个全局二级索引基于 Data 属性构建。此属性使用全局二级索引重载 (如前所述) 为若干不同的属性类型 (即 Dates、Names、Places 和 Skills) 编制索引。此处,一个全局二级索引可为 4 个不同属性有效编制索引。

将项目插入表时,可使用智能分片策略跨全局二级索引上所需数量的逻辑分区分发包含大型聚合 (生日、技能) 的项目集,从而避免热读取/写入问题。

此设计模式组合为高效实时图表工作流生成一个可靠数据存储。这些工作流可提供针对建议引擎、社交网络应用程序节点排名、子树聚合和其他常见图表使用案例的高性能相邻实体状态和边缘聚合查询。

如果使用案例对实时数据一致性不敏感,则可使用计划的 Amazon EMR 流程用工作流的相关图表摘要聚合填充边缘,这种方式经济高效。如果应用程序不需要立即知道边缘添加到图表的时间,则可使用计划的流程聚合结果。

为保持一定程度的一致性,此设计可能包含 Amazon DynamoDB 流和 AWS Lambda 以处理边缘更新。它还可定期使用 Amazon EMR 任务验证结果。下方的关系图阐述了此方式。它通常用于社交网络应用程序,其中实时查询成本高并且立即知道独立用户更新的需求低。


        阐述图表工作流的关系图。

IT 服务管理 (ITSM) 和安全应用程序一般需要实时响应包含复杂边缘聚合的实体状态更改。此类应用程序需要一个系统来支持二级和三级关系的实时多个节点聚合或复杂边缘遍历。如果使用案例需要这些类型的实时图表查询工作流,建议考虑使用 Amazon Neptune 管理这些工作流。

本页内容: