DynamoDB单表设计中ConditionExpression确保主键唯一的原理咨询
DynamoDB中
attribute_not_exists(pk)实现主键组合唯一的原理 你能达到预期效果的核心逻辑,和DynamoDB的主键定位规则、条件表达式的作用范围直接相关:
主键是分区键+排序键的唯一组合
你的设计里,EM#<email>作为分区键(pk),SB#<thread id>作为排序键(sk),DynamoDB中真正的唯一数据标识是这两个键的组合,而非单独的pk或sk。执行PutItemCommand时,你必须同时指定这两个键,DynamoDB会先根据这个组合定位到具体的条目位置。attribute_not_exists(pk)的检查范围是目标条目
这个条件表达式不是检查整张表中是否存在相同的pk值,而是检查当前要写入的主键组合对应的条目里,是否存在pk属性:- 如果该(pk,sk)组合已存在(即邮箱已订阅过该线程),对应的条目必然包含pk属性(主键属性是DynamoDB条目的必填属性),此时条件不满足,PutItem操作失败。
- 如果该组合不存在,目标位置没有任何条目,自然也不存在pk属性,条件满足,PutItem成功写入新条目。
写法的等价性
你当前的写法和直接检查主键组合是否存在的效果完全一致,也可以写成attribute_not_exists(pk) AND attribute_not_exists(sk),但因为主键组合存在时两个属性必然都存在,所以单独写attribute_not_exists(pk)就足够实现去重逻辑。
内容的提问来源于stack exchange,提问作者Benjamin Hobson
相关产品推荐
相关产品推荐

