在dynamodb

时间:2015-09-19 02:42:14

标签: amazon-web-services amazon-dynamodb aws-sdk

我读到了这个: Is there a way to enforce unique constraint on a property (field) other than the primary key in dynamodb

不确定这是否完全回应了我的用例。

我在dynamodb中有3个属性。

| A | B | C |

所有A和B两个属性在整个表中都是唯一的。我的意思是可以有2个项目

A = 1, B = 2 ; A = 2, B = 1

但不能有2个项目

A = 1, B = 1; A = 2, B = 1
OR
A = 1, B = 1; A = 1, B = 2

如何在该dynamodb中插入新值(不对该表进行非规范化),这样我就不会破坏该数据库约束?我认为条件表达式可以解决主键问题http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html 和交易经理 https://java.awsblog.com/post/Tx13H2W58QMAOA7/Performing-Conditional-Writes-Using-the-Amazon-DynamoDB-Transaction-Library 也可能不起作用,因为我认为它检测到使用相同主键属性检索的记录的更改而不是其他唯一属性

1 个答案:

答案 0 :(得分:0)

我担心在dynamoDB中这是不可能的,因为它是一个键值存储。

看看这个问题:Is there a way to enforce unique constraint on a property (field) other than the primary key in dynamodb

我不确定您是如何使用dynamoDB的,但如果您使用Java aws-sdk管理数据,那么您可能会很幸运,因为Mapper类提供了一种在执行某些操作时如何指定表达式的方法。您可以将唯一性条件放入表达式中,以便仅在满足所有条件时强制执行。

查看THIS文章,其中介绍了如何在dynamoDB中使用表达式。此代码取自该文章:

try {
   DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
   Map expected = new HashMap();
   expected.put("status", 
      new ExpectedAttributeValue(new AttributeValue("READY").withExists(true));

   saveExpression.setExpected(expected);

   mapper.save(obj, saveExpression);
} catch (ConditionalCheckFailedException e) {
   // This means our save wasn't recorded, since our constraint wasn't met
   // If this happens, the worker can simply look for a new task to work on
}