DynamoDB MM邻接列表设计模式

Blu*_*oba 17 many-to-many amazon-dynamodb

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

第一张图片是表格,第二张图片是GSI.这是表格: 在此输入图像描述

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

只是通过查看前缀"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查看此处的图片: 在此输入图像描述

谢谢大家!!!:-)

F_S*_*O_K 32

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

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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

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

  • 他们已将分区键合并为一个盒子,但它们是单独的项目.
  • 他们还试图在同一张图片中展示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
Run Code Online (Sandbox Code Playgroud)

以下是您的疑问:

Partition key: Album1
Run Code Online (Sandbox Code Playgroud)

在相册1(暗侧)上提供所有信息(包括曲目)

Partition key: Album1 and Sort Key: Album1:Track2
Run Code Online (Sandbox Code Playgroud)

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

Partition key: Movie8
Run Code Online (Sandbox Code Playgroud)

给你关于Movie8(Idiocracy)的所有信息(包括演员)

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

  • 嗨,斯图,你应该成为一名作家。你善于解释。我也开始有同样的想法:“您可以将基表和 GSI 视为两个保持同步的独立表”。我想更正您,“GSI 查询将具有分区键 Bill-4224663。如果您查看我上面绘制的 GSI 表,您可以看到这将返回两个项目,显示 Bill-4224663”。我想你的意思是“Bill-4224687”。这可能会让其他读者感到困惑,除非我错了? (3认同)

mix*_*xja 8

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
Run Code Online (Sandbox Code Playgroud)

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

为了完全重建帐单,需要一个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!
Run Code Online (Sandbox Code Playgroud)

  • 现在我终于理解了邻接列表,我感到有点失望,它确实使数据失去了人性,并且在我看来使其变得不可读,如果我不需要它太难扩展,我宁愿拥有更多的 Json-y 数据结构和损失几毫秒。 (2认同)