DynamoDB是否支持Tombstone记录处理?

时间:2018-06-18 17:15:29

标签: database concurrency amazon-dynamodb

如果对已经执行了较新删除操作的密钥有较旧的put请求,我们如何处理dynamoDB中的情况。

由于较新的删除操作已经删除了记录,旧的put请求可以简单地再次写入记录,这是不正确的。

DynamoDB是否会为最近删除的记录保存任何元数据? 有没有办法在DynamoDB中处理这种情况?或者任何人都有任何建议如何处理这种情况。

我使用的是高级DynamoDBMapper而不是低级API。

2 个答案:

答案 0 :(得分:1)

Dynamo不会保留有关先前已删除内容的任何“元数据”。考虑到您无法创建新属性来跟踪已删除状态,因此我认为只有两种方法可以解决此问题:

选项1:创建自己的“元数据”表

创建一个单独的表以跟踪您删除的所有内容。您将有一个main表,用于存储常规数据,还有一个main_deleted表,其中仅存储从primary_keys表中删除的main。 / p>

在将main表中插入任何项目之前,请检查primary_key表中的main_deleted。如果存在,请勿继续插入。

选项2:使用range_key

如果项目具有排序键,则可以使用它来将项目标记为已删除,而无需创建新属性。假设您有以下项目,其中range_key是UNIX时间戳记:

{
    "primary_key": "example",
    "timestamp": 1234567890,
    "other": "stuff"
}

不要删除项primary_key=example,而是删除其所有属性,并将timestamp设置为您从未用于常规项的值,例如0。在表中插入或更新项目时,请使用条件表达式或先前查询数据库以检查该项目之前是否未被删除(换句话说,timestamp=0)。

我敢肯定还有很多其他方法,也许(或者可能是)以上两种不是最好的方法。利用您的创造力! ;)

答案 1 :(得分:0)

我相信您可以在更新(即放入)该项目之前使用ConditionExpression检查数据是否已经存在。 UpdateItemPutItem都有ConditionExpression在执行操作之前检查某些条件。

请参阅此conditional writes

对于您而言,您需要在执行更新操作之前检查hash key是否存在。