4

我试图更好地理解在 AWS DynamoDB 中使用邻接列表模式进行多对多 (m:n) 关系设计。

在此处查看 AWS 文档:https ://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html我们有一个示例,其中包含具有 m:n 关系的 Invoice 和 Bill 实体。

在此处输入图像描述

我了解我可以通过读取单个分区来获取与特定发票相关的所有账单的详细信息。例如,我可以查询 Invoice-92551 并根据分区中的附加项目了解与它关联的 2 个账单的一些属性。

我的问题是我必须做什么才能获得这两张账单的完整账单属性。这是否需要使用我从发票分区派生的 ID 进行 2 个额外的查询,还是我在这里缺少一些其他模式?

附加细节 参考截图中账单项目的 2 种不同描述:

  • 发票分区中的帐单项目:“此发票中此帐单的属性”
  • 自己分区中的账单项目:“此账单的更多属性”

这是否意味着我的 Invoice 分区应该包含我想通过最少查询访问的任何 Bill 属性?我最初认为 Bill 分区将包含我想要的大部分内容,但如果我想通过 Invoice 来获取它们,这并不完全有意义。

4

2 回答 2

1

不,没有其他查询 - 除非您只询问(“项目”)某些属性,否则您的查询将检索账单的所有属性及其键。

DynamoDB 将每个分区一起存储在单个节点上,因此获取整个分区非常高效。此分区由其“分区键”(您的发票编号)定义。该分区包含一堆“项目”(您的账单),每个项目都有自己的“排序键”(您的账单 ID)和任意数量的“属性”。当 DynamoDB 读取分区时,它会按顺序读取这些项目及其所有属性,并且可以返回所有这些项目,除非您明确要求它不要这样做。请注意,即使您只要求它返回这些属性的子集(“投影”),Amazon 仍然需要从磁盘读取它们,并且您仍然需要为此 I/O 付费。

于 2019-05-09T06:45:49.783 回答
0

您有两个选择:发出多个查询或复制一些账单数据。当您查询发票及其账单时,您会得到

  • 此发票的更多属性,以及
  • 此发票中此帐单的属性

对于任何账单,您都不会获得“此账单的更多属性”。要获得这些,您必须自己查询账单。您可以使用帐单 ID发出单个GetItem查询或单个查询(每个查询限制为 100 个帐单)。BatchGetItem

或者,您可以将“此账单的更多属性”中的一些值复制到每个invoice-bill项目,以避免以存储和插入/更新复杂性为代价的第二次查询。

于 2021-12-10T16:38:59.947 回答