2015-09-19 48 views
1

2个独特属性的新值我读这: Is there a way to enforce unique constraint on a property (field) other than the primary key in dynamodb插入与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 ,因为我觉得它可以检测并不能与其他独特属性的改变与相同的主键属性检索记录

回答

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 
} 
+0

其实,我想要做的是只存储唯一值,否则失败。据我了解,我们可以存储唯一的As,但是我们无法强制所有的Bs都是唯一的,即使是“预期”的地图也是如此。纠正我,如果我错了。 –

+0

你说得对,这可能不是你最好的解决方案。我想到的唯一解决方案是使用单独的表格作为唯一参数,并在插入新值时使用条件放置,但在处理大量值时可能非常不方便。正如我在回答中所述,DynamoDB不支持唯一性约束...... – Smajl

+0

即使使用单独的表格,如果应用程序是多线程的或分布式的,则在处理竞态条件时也会遇到问题。 –