2013年4月20日土曜日

DynamoDB: ローカルセカンダリインデックスを使ってみた(DynamoDBMapper利用編)

早速話題のDynamoDBのローカルセカンダリインデックスを、高レベルAPIであるDynamoDBMapperクラスから利用してみました。以下はJavaDocを見ながら試行錯誤で試してみた速報的なものですので、若干勘違いもあるかもしれません。

なお、ローカルセカンダリインデックスを使うためには、ライブラリのパッケージは
com.amazonaws.services.dynamodbv2.*
以下を使用することになるので注意してください。

ローカルセカンダリインデックスを持つテーブルの作成
テーブル作成時にローカルセカンダリインデックスを定義する必要があります。事後にインデックスを追加することはできないので要注意ですね。


Index Name名というのがよくわからないので、Attributeの名前を同じにしました。

データクラスにアノテーションを記述する
アノテーションの記述方法ですが、ローカルセカンダリインデックスに相当するAttributeについては、
@DynamoDBIndexRangeKey(localSecondaryIndexName ="age")
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
というようにします。

ローカルセカンダリインデックスで検索をかける
従来のRangeKeyに対する検索の方法と同じです。
上記は、年齢(age)をセカンダリインデックスとして20才のデータを探している例です。

ローカルセカンダリインデックスの特徴
個人的にポイントと思っているのは下記の点です。
  • テーブル毎に最大5つのローカルセカンダリインデックスを作成可能
  • あくまでも従来のレンジキーに対する代替 
  • 複数のローカルセカンダリインデックスを組み合わせた検索は不可
  • 従来のレンジキーとの組み合わせも不可
  • 紐付けるAttributeによってコストが増える?
従来よりも便利になることは間違いないですが、どういった検索をするかを考えた上でインデックスを定義しておかないといけないわけで、意外と設計の難易度が高いという印象です。

APIの仕様が若干変化している点に注意
パッケージがcom.amazonaws.services.dynamodbv2に変わるとともに、微妙にAPIの仕様が変わってます。今までのコードが動かなくなる可能性が高いので注意が必要でしょう。現状すでにDynamoDBで運用している場合は、移行の際は注意した方がいいです。

0 件のコメント:

コメントを投稿