DynamoDB M-M邻接列表设计模式

时间:2018-05-06 23:49:50

标签: many-to-many amazon-dynamodb

参考https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html。我想知道是否有人可以帮助我。

第一张图片是表格,第二张图片是GSI。这是表格: enter image description here

在桌面上,我不明白如何创建排序键?这是一个存储Bill-ID和Invoice-ID的属性吗?还是两个独立的属性?我觉得这是一个灵活的属性,如果是这样,你如何区分彼此?我们如何在sort-key上构建查询?

只是通过查看前缀“Bill-”或“Invoice-”? DynamoDB的实践似乎使用破折号(“ - ”)来分隔属性中的值。如果有人能给我这些事情的用例,我也会感激不尽,但除非在这种情况下很重要,否则我会切断正确。

现在,这是非常相关且非常有趣的https://youtu.be/xV-As-sYKyg?t=1897,其中演示者使用一个产品表来存储各种类型的项目:书籍,歌曲专辑和电影;每个都有自己的属性。

我在理解那里使用的排序键时遇到了问题。我知道productID = 1是bookID,productID = 2是专辑。现在让它变得混乱的是我用红色圈出的东西。这些是专辑2的曲目。但是,排序键的结构是“albumID:trackID”。现在,“trackID”在哪里?它是否意味着用实际ID替换“trackID”这个词?或者这是一个完全像“albumID:trackID”的文本?。

如果我想查询特定的trackID怎么办?我的查询的语法是什么?

请从youtube查看此处的图片: enter image description here

提前谢谢大家!!! : - )

2 个答案:

答案 0 :(得分:26)

在第一张图片中,你发布的基本表格(主键)中的项目如下所示:

First_id(Partition key)        Second_id(Sort Key)          Dated
-------------                   ----------                  ------
Invoice-92551                   Invoice-92551               2018-02-07
Invoice-92551                   Bill-4224663                2017-12-03
Invoice-92551                   Bill-4224687                2018-01-09
Invoice-92552                   Invoice-92552               2018-03-04
Invoice-92552                   Bill-4224687                2018-01-09

GSI 中的相同项目看起来像这样

Second_id(Partition Key)       First_id
----------                     ---------------
Invoice-92551                  Invoice-92551 
Bill-4224663                   Invoice-92551 
Bill-4224687                   Invoice-92551 
Invoice-92552                  Invoice-92552
Bill-4224687                   Invoice-92552 

他们以相当混乱的方式吸引了它。

  • 他们已将分区键合并到一个盒子中,但它们是单独的项目。
  • 他们也试图在同一张照片中展示GSI。您可以将基表和GSI视为两个独立的表,它们保持同步,这在很多方面就是它们的原样。
  • 他们实际上没有为关键属性提供名称。在我的例子中,我将它们命名为First_id和Second_id。

当您对基表进行查询时,您可以使用分区键Invoice-92551的查询,同时获得“发票”项目以及属于该项目的所有帐单项目。

想象一下,您正在查看应用中的发票Invoice-92551,您可以看到它有两个关联的帐单(Bill-4224663Bill-4224687)。如果您单击该帐单,应用程序可能会对GSI进行查询。 GSI查询将具有分区键Bill-4224687。如果您查看我上面提到的GSI表,您可以看到这将返回两项,表明Bill-4224687是两张发票的一部分(Invoice-92551Invoice-92552

在你的第二张照片中,'bookID'和'albumID'等词应该代表实际ID(比方说293847和3340876)。

我会这样画他的例子:

ProductID(Partition Key) TypeID(Sort Key)  Title          Name      
---------                ------            ------         ------
Album1                   Album1            Dark Side
Album1                   Album1:Track1     Speak to me
Album1                   Album1:Track2     Breathe
Movie8                   Movie8            Idiocracy
Movie8                   Movie8:Actor1                    Luke Wilson
Movie8                   Movie8:Actor2                    Maya Rudolph

以下是您的疑问:

Partition key: Album1

在相册1(暗侧)

上提供所有信息(包括曲目)
Partition key: Album1 and Sort Key: Album1:Track2

为您提供有关呼吸的信息。

Partition key: Movie8

在Movie8(Idiocracy)上提供所有信息(包括演员)

如果我正在构建表格,我会这样做,因此电影,专辑等单词是实际ID的一部分(比如Movie018274和Album983745987),但这不是必需的,它只是使ID更具人性化。

答案 1 :(得分:5)

Stu的答案不是很正确,该表实际上如图所示:

First_id(Partition key)        Second_id(Sort Key)          Dated
-------------                   ----------                  ------
Invoice-92551                   Invoice-92551               2018-02-07
Invoice-92551                   Bill-4224663                2017-12-03
Invoice-92551                   Bill-4224687                2018-01-09
Invoice-92552                   Invoice-92552               2018-03-04
Invoice-92552                   Bill-4224687                2018-01-09
Bill-4224663                    Bill-4224663                2018-12-03
Bill-4224687                    Bill-4224687                2018-01-09

在上表中,“帐单”项目(即分区键= Bill-xxxxx)保存该帐单的通用信息,其中以“帐单”项目作为排序关键字的“发票”项目保存特定于给定发票的帐单信息

为了完全重建帐单,需要一个GSI,该GSI允许您查找帐单的完整信息(即公用记录+发票专用记录):

Second_id(Partition Key)       First_id                   Data
----------                     ---------------            -----------
Bill-4224663                   Bill-4224663               Common bill data
Bill-4224663                   Invoice-92551              Bill data for Invoice-92551
Bill-4224687                   Bill-4224687               Common bill data
Bill-4224687                   Invoice-92551              Bill data for Invoice-92551
Bill-4224687                   Invoice-92552              Bill data for Invoice-92552
Invoice-92551                  Invoice-92551              Redundant data!
Invoice-92552                  Invoice-92552              Redundant data!