Amazon web services Dynamodb项目设计用于检索

Amazon web services Dynamodb项目设计用于检索,amazon-web-services,database-design,nosql,amazon-dynamodb,Amazon Web Services,Database Design,Nosql,Amazon Dynamodb,我们正在为元数据制作一个内部收集器,用于将kube图像部署到集群并存储在dynamodb中(它将跟踪每次在列表中部署新的图像标记)。这将是我第一次使用dynamodb,可能是第五次使用nosql概念 考虑一下他们想要的rest调用:按服务名称、集群名称和图像名称获取所有项目。起初,我不明白这个数据库中的检索工作与关系数据库中的检索工作有多大不同。我现在明白了,我将使用反模式,因为我不打算使用UUID进行任何有用的搜索,需要创建3个全局搜索索引,以允许我进行其他检索……这真的是最好的方法吗 我觉得

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

考虑一下他们想要的rest调用:按服务名称、集群名称和图像名称获取所有项目。起初,我不明白这个数据库中的检索工作与关系数据库中的检索工作有多大不同。我现在明白了,我将使用反模式,因为我不打算使用UUID进行任何有用的搜索,需要创建3个全局搜索索引,以允许我进行其他检索……这真的是最好的方法吗

我觉得我可能没抓住重点

我唯一能想到的另一件事是看看系统的用户是否愿意总是给我集群名称和服务名称作为基础。然后,我可以将其作为一个连接字段,并在此基础上进行搜索

我要存储的数据:

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

为每个您想要查询的属性创建GSI是否存在问题?现在,您有三个服务名称、集群名称和映像名称

如果是这样的话,您可以这样做,并利用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中查询这三个属性。但它必须与正在搜索的字符串完全匹配,因为它是唯一的哈希键

如果要查询以“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 
现在,利用排序键的优点,您可以查询,例如
开头(以及更多功能),例如
获取所有以“a\u服务名称”开头的服务


但现在,如果您想获取“a_服务\u名称\u 1”项的图像标签,则需要额外读取。或者你可以对属性1、属性2等进行反规范化

让你明白为什么你被限制在5个GSI之内。谢谢CanSahin,