为检索而设计的Dynamodb物品

时间:2018-08-03 22:16:18

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

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

他们想进行休息电话:通过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"}
                 ]
}

1 个答案:

答案 0 :(得分:0)

在为您希望其可查询的每个属性创建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等等...