SimpleDB でユニーク制約を行う

SimpleDB では SQL のようにテーブル属性としてユニーク制約を定義することができないため、ユニーク制約を行いたい場合は、以下のように UpdateCondition を指定してデータを登録します。

この例の場合は、メールアドレスをキーに、存在するであろう属性を検索して、見つかった場合は既に登録済みとみなして排他処理を行って、別のスレッドからの並列書き込みによる上書きを回避しています。

    AmazonSimpleDBClient client =
      new AmazonSimpleDBClient(new AWSCredentials() {
        @Override
        public String getAWSSecretKey() {
          return awsSecretKey;
        }

        @Override
        public String getAWSAccessKeyId() {
          return awsAccessKey;
        }
      });
    List<ReplaceableAttribute> list = new ArrayList<ReplaceableAttribute>();
    list.add(new ReplaceableAttribute("id", "001", true));

    client.putAttributes(new PutAttributesRequest()
      .withDomainName("user")
      .withItemName("user1@sample.com")
      .withAttributes(list)
      .withExpected(new UpdateCondition().withExists(false).withName("id")));