【问题标题】:Dynamodb item designed for retrieval专为检索而设计的 Dynamodb 项目
【发布时间】:2019-01-11 19:44:46
【问题描述】:

我们正在为将 kube 图像部署到集群并存储在 dynamodb 中的元数据创建一个内部收集器(它会跟踪每次在列表中部署新的图像标签)。这将是我第一次使用 dynamodb,也许是第五次使用 nosql 概念。

考虑他们想要的 rest 调用:通过 service_name、cluster_name 和 image_name 获取所有项目。最初,我不明白该数据库与关系数据库中的检索工作有何不同。我现在明白我将使用反模式,因为我不打算使用 UUID 进行任何有用的搜索,并且需要创建 3 个全局搜索索引,以便我进行其他检索.....这真的是最好的方法?

我觉得我可能错过了标记。

我唯一能想到的另一件事是看看系统的用户是否愿意总是给我 cluster_name 和 service_name 作为基础。然后我可以把它变成一个连接字段并基于它进行搜索。

我要存储的数据:

{ "uuid" : "generated_uui",
  "cluster_name" : "cluster",
  "service_name" : "servicename",
  "image_name" : "imagename",
  "image_tags" : [{"date" : "date", "tag" : "imagetag"},
                  {"date" : "date", "tag" : "imagetag"}
                 ]
}

【问题讨论】:

    标签: amazon-web-services database-design nosql amazon-dynamodb


    【解决方案1】:

    您是否有问题为您希望它可查询的每个属性创建 GSI?目前,您拥有三个 service_name、cluster_name 和 image_name。

    如果是这样,您可以使用GSI Overloading,并利用 DynamoDB 的无模式优势。简而言之,您可以将可查询的属性放在一个属性中(这将是您的排序键,也是您的 GSI 分区键)

    示例 1:

    |   PartitionKey  | SortKey and GSI PartionKey |  Atrribute 1 | Atrribute 2 | 
    |:---------------:|---------------------------:|:------------:|
    | generated_uui_1 |        image_tags          |     [{tag: 1}]     
    | generated_uui_1 | cluster:a_cluster_name_1   |         
    | generated_uui_1 | service:a_service_name_1   |     
    | generated_uui_1 | image:a_image_name_1       |        
    | generated_uui_2 |        image_tags          |     [{tag: 2}]     
    | generated_uui_2 | cluster:a_cluster_name_2   |       
    | generated_uui_2 | service:a_service_name_2   |     
    | generated_uui_2 | image:a_image_name_2       |         
    

    您可以在此处查询单个 GSI 中的 3 个属性。但它必须与您正在搜索的字符串完全匹配,因为它是唯一的哈希键。

    如果您想查询以“a_cluster”开头的实例集群,您可以简单地将上表修改为此

    示例 2:

    |   PartitionKey  | SortKey and GSI PartionKey |  Atrribute 1 (GSI SortKey) | Atrribute 2 | 
    |:---------------:|---------------------------:|:--------------------------:|
    | generated_uui_1 |        image_tags          |     [{tag: 1}]     
    | generated_uui_1 |        cluster_name        |     a_cluster_name_1  
    | generated_uui_1 |        service_name        |     a_service_name_1
    | generated_uui_1 |        image_name          |     a_image_name_1   
    | generated_uui_2 |        image_tags          |     [{tag: 2}]     
    | generated_uui_2 |        cluster_name        |     a_cluster_name_2  
    | generated_uui_2 |        service_name        |     a_service_name_2
    | generated_uui_2 |        image_name          |     a_image_name_2 
    

    现在借助排序键的优势,您可以使用例如BEGINS_WITH(以及更多功能)进行查询,例如Get me all services that starts with 'a_service_name'

    但现在,如果您想获取“a_service_name_1”项目的 image_tags,则需要额外阅读。或者你可以对它进行非规范化属性 1、属性 2 等等...

    【讨论】:

    • 更清楚为什么您仅限于 5 个 GSI。谢谢 CanSahin,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多