我们正在为将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"}
]
}
答案 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等等...