many-to-many - DynamoDB M-M 邻接表设计模式

标签 many-to-many amazon-dynamodb

引用 amazon .我想知道是否有人可以帮助我。
第一个图像是表格,第二个是 GSI。这是表格:
here
在 table 上,我不明白如何创建排序键?这是同时存储 Bill-ID 和 Invoice-ID 的属性吗?还是两个单独的属性?我有一种感觉,这是一个灵活的属性,如果是这样,你如何区分一个和另一个?以及我们如何在排序键上构造查询?
只是通过查看前缀“Bill-”或“Invoice-”吗?
DynamoDB 的做法似乎使用破折号(“-”)来分隔属性中的值。如果有人可以给我这些事情的用例,我也将不胜感激,但除非在这种情况下很重要,否则我会离题。
现在,这是非常相关且非常有趣的YouTube ,演示者使用一个产品表来存储各种类型的项目:书籍、歌曲专辑和电影;并且每个都有自己的属性。
同样,我在理解那里使用的排序键时遇到了问题。我知道 productID=1 是 bookID,productID=2 是专辑。现在变得令人困惑的是我用红色圈出的地方。这些是专辑 2 的轨道。但是,排序键的结构是“albumID:trackID”。现在,“trackID”在哪里?是用实际 ID 代替“trackID”这个词吗?或者这是否意味着与“albumID:trackID”完全一样的文本?
如果我想查询特定的 trackID 怎么办?我的查询的语法是什么?
请在 youtube 上查看图片:
enter image description here
谢谢大家!!! :-)

最佳答案

在第一张图片中,您发布了 中的项目基表(主键)看起来像这样:

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

中的相同项目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
Bill-4224663                   Bill-4224663
Bill-4224687                   Bill-4224687 

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

  • 对基表进行查询时,可以使用带有分区键 Invoice-92551 的查询并且您将同时获得 Invoice 项目以及属于它的所有账单项目。

    假设您正在查看发票 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) 的所有信息(包括 Actor )

    如果我正在构建表格,我会制作它,因此电影、专辑等单词是实际 ID 的一部分(例如 Movie018274 和 Album983745987),但这不是必需的,它只是使 ID 更易于阅读。

    关于many-to-many - DynamoDB M-M 邻接表设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205518/

    相关文章:

    sql - JPA with Hibernate - 多对多关系,获取所有数据

    amazon-web-services - 如果值不存在,dynamodb 是否支持 SET 操作上的原子计数器?

    node.js - 使用全局二级索引的DynamoDB表查询项

    java - AmazonDynamoDBClient 的线程安全/可重用性/生命周期?

    amazon-dynamodb - 在 Cloudformation 中创建 DynamoDB 表失败

    MySQL查询多对多有限制

    java - 当访问模式依赖于一对多时,如何处理 POJO 中多对多表中的附加属性?

    amazon-web-services - 在 dynamodb 中,使用 dynamo 流 + lambda 触发器与 kinesis 流 + lambda 触发器有什么区别?

    python - Django - 从实例访问模型的 "through"表上的字段

    java - 我的公式注释中的表不存在错误