DynamoDB:如何在没有使用主键的情况下删除项目

4
我正在我们的项目中实现DynamoDB。我们需要将大数据字符串放入数据库中,因此我们将数据拆分成小块,并插入多行,仅更改一个属性值-字符串的一部分。一个列(范围键)包含一部分数量。对于小型和大型字符串,插入和选择数据都运作得非常好。问题出在删除项目上。我读到当你想要删除一个项目时,你需要为这个项目指定主键(哈希键或哈希键和范围键 - 取决于表格)。但是,如果我想删除具有某些属性值的项目,该怎么办?我需要扫描(扫描,而不是查询)整个表格,并对每一行运行“delete”或“batch delete”吗?还是有另外一种解决方案,而不使用两个查询?我的目标是避免扫描整个表格。我认为我们在这样的表中将有大约1亿到10亿行,因此扫描速度会非常慢。
谢谢帮助。

你考虑过使用S3来存储大字符串吗?http://aws.amazon.com/dynamodb/faqs/#When_should_I_use_Amazon_DynamoDB_vs_Amazon_S3 你仍然可以使用DynamoDB来存储S3索引。 - yadutaf
1个回答

1

在DynamoDB中,没有办法删除任意元素。您确实需要知道hash_keyrange_key

如果query不能满足您的需求(即您甚至不知道hash_key),那么您就陷入了困境。

最好的方法是重新考虑数据建模。构建一个自定义索引或执行“延迟删除”。

要实现“延迟删除”,请使用表作为要删除元素的队列。定期在其中运行EMR以在单个扫描操作中执行所有删除操作。这确实不是最佳解决方案,但这是我能想到的避免重新建模的唯一方法。

TL;DR:没有真正的方法,只有解决方法。我强烈建议您重新建模至少部分数据。


谢谢您的回答!最终我将RangeKey与PartNumber结合起来,以便可以使用两个值删除项目。 这很好用。但现在,当我仅知道RangeKey时,我必须删除该项。阅读您提供的文章后,我考虑创建另一个表,在该表中,第一个表中的RangeKey将成为HashKey,而RangeKey将包含第一个表中的HashKey。因此,当我尝试仅知道RangeKey删除项目时,我需要查询我的附加表并检索具有RangeKeys的所有数据。现在,我知道先前表的HashKey和RangeKey,并且可以运行删除查询了。这是正确的解决方案吗? - Krzysztof Sałajczyk
你能否更新你最初的问题并提供一个使用案例,或者开一个新的问题?提供一个示例将会极大地帮助你! - yadutaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接