Amazon dynamodb DynamoDB邻接列表模式

Amazon dynamodb DynamoDB邻接列表模式,amazon-dynamodb,adjacency-list,Amazon Dynamodb,Adjacency List,我试图更好地理解在AWS DynamoDB中使用邻接列表模式进行多对多(m:n)关系设计 看看这里的AWS文档:我们有一个例子,其中一个发票和账单实体具有m:n关系 我知道我可以通过读取单个分区来获取与特定发票相关联的所有账单的详细信息。例如,我可以查询Invoice-92551,并根据分区中的其他项目了解与其关联的两张票据的一些属性 我的问题是,我必须做什么才能获得这两张账单的完整账单属性。这是否需要使用我从invoice分区派生的ID进行2次额外的查询,或者这里是否缺少其他模式 其他详细信

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

看看这里的AWS文档:我们有一个例子,其中一个发票和账单实体具有m:n关系

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

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

其他详细信息 参考屏幕截图中账单项目的两种不同描述:

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

这是否意味着我的发票分区应该包括我希望通过最小查询访问的任何账单属性?我最初认为账单分区将包含我想要的大部分内容,但如果我想通过发票获取这些内容,那就没有什么意义了。

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


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

因此,如果发票分区中的订单项中有我需要的所有属性,则此项操作有效,对吗?AWS文档使订单看起来有自己的带有特定属性的分区,而发票分区中的订单只有与发票相关的属性。我假设这意味着我必须复制这两个地方的所有属性?恐怕我不完全理解Amazon的示例。只有具有特定排序键的单个“项”,而不是“分区”,才具有附加属性。上面的例子还提到他们使用GSI。GSI(全局辅助索引)允许您将所有相同的属性复制到由不同键索引的项。也许这个GSI意味着你不需要“在两个地方复制所有属性”-这正是GSI为你做的。我想我理解的是,在单个分区读取中没有神奇的方法包含来自其他分区的数据。GSI可以从读取的角度有效地重新分区,但如果我从发票id开始并获取关联的账单,我将只能访问该分区中的任何属性,然后必须重新发出对其他分区中数据的查询?或者,我可以在InvoiceIllItems中包含更多属性,以便在第一次读取时访问它们。这让我想知道,与拥有不同的账单表相比,选择邻接列表模式有什么优势。无论如何,它需要额外的查询。