【问题标题】:DynamoDB LSI or GSI to query on composite attributeDynamoDB LSI 或 GS​​I 查询复合属性
【发布时间】:2022-08-11 01:12:27
【问题描述】:

我正在尝试将 DynamoDB 用于我的 JAVA 项目,并且我有这个(从我的角度来看)我必须涵盖的奇怪场景。让我解释一下我是如何组织我的桌子的:

假设我必须存储这些与书籍相关的信息:

  • book_id (UUID) 用作自动生成的 PK

  • author_id (UUID)

  • type(字符串)

  • book_code (UUID) 这与 book_id 的概念不同

  • publishing_house_id(字符串)

  • book_gender(字符串)

以及其他不可查询的动态属性,我正在考虑存储为文档(JSON)

现在,我需要的查询是:

  1. 按 book_id 插入/获取/更新/删除图书
  2. 通过author_id获取所有书籍
  3. 通过author_id and type获取所有书籍
  4. 通过book_code, publishing_house_id, book_gender 获取书籍(我想强调这个元组是独一无二的)
    • 使用 book_id 作为 PK 我将能够覆盖第一个查询集(CRUD 使用 book id)
    • 对于查询 #2 和 #3,我们的想法是创建一个 GS 索引,其中 author_id 是 PK,type 是 SK。

    为了涵盖查询#4,我正在考虑:

    • 创建一个专用的属性 book_sk 我将在其中存储: book_gender#publishing_house_id#book_code
    • 使用此 book_sk 作为 SK 创建本地二级索引
    • 也许我可以将 book_code、publishing_house_id、book_gender 移动到 Document 字段中,而不是在此处拥有这些不可查询的属性。

    我不太确定这个设计。

    你怎么看?

    在这种情况下,查询#4 是使用 LSI 还是 GSI 更好?

    标签: amazon-web-services nosql amazon-dynamodb dynamodb-queries amazon-dynamodb-index


    【解决方案1】:

    对于#4,如果您总是将这三者放在一起,则使用该连接值创建一个属性并将其用作 GSI 的 PK,以便于直接查找。

    【讨论】:

    • 非常感谢。因此,对于这种情况,最好使用 GSI ...。我很确定使用 LSI 会更好……我必须再次理解/找到它的真实/可能用法……什么时候使用 LSI 而不是 GSI 更好?
    • 除非有经验的 DynamoDB 用户要求,否则不要使用 LSI。它们为您提供了强一致性的好处,但损害了可扩展性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2021-02-26
    • 2022-01-10
    • 2017-07-18
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多