DynamoDBのキー・インデックスに関するまとめ 〜ハッシュキー(パーティションキー)、レンジキー(ソートキー)、プライマリキー、ローカルセカンダリインデックス、グローバルセカンダリインデックスの説明、違い、使い方、使用方法、例題、サンプル〜

AWS,DynamoDB

AWS Lambda、Amazon API Gatewayに続きAWS IOTが発表され時代はモバイルとクラウドが融合したIOTへとトレンドが向かっていることが明確になって来ました。
このような状況下で今までよりもまして重要になってくるのがモバイル端末から送られてくる大量のデータを高速に保存し分析するKVS(キーバリューストア)型NoSQLです。

AWSにおいてはすでにチャットシステムやソーシャルゲームなどで幅広く活用されているDynamoDBがあります。

DynamoDBは高いパフォーマンスとスケーラビリティを兼ね備えているため昨今のITトレンドに対応しやすいですが、検索に使用するキーについては独特の考え方・設計がされているため使用するにあたっては一癖あります。

今回はAWSのKVS型NoSQLとして広く活用されているDynamoDBのキー・インデックスについて備忘録として記載しておきたいと思います。

DynamoDBにおけるハッシュキー(パーティションキー)、レンジキー(ソートキー)、プライマリキー、ローカルセカンダリインデックス、グローバルセカンダリインデックス

最近トレンドのIOTでモバイル端末からデータをAWSに送信した場合に想定される例でDynamoDBのキーについて説明します。

説明に使用するサンプルデータ

例の前提:モバイル端末にインストールされているアプリケーションが1秒ごとに端末の位置情報と温度データを送信しDynamoDBに保存する

説明に使用するサンプルデータの項目

DeviceID: モバイル端末を一意に識別するID
TimeStamp: データ送信を行った際のタイムスタンプ(DeviceIDに対して一意性がある前提)
GPSInfo: モバイル端末の位置情報
Temperature: モバイル端末のセンターで取得した温度
ItemID: Itemを一意に識別するID(全てのデータに対して一意性がある前提)

説明に使用するサンプルデータの具体例

DeviceID TimeStamp GPSInfo Temperature ItemID
123456789012345 1448550000 '{“lat": “35.681036","lng": “139.767713"}’ 10.00 1
123456789012345 1448550001 '{“lat": “35.681037","lng": “139.767714"}’ 10.01 2
123456789012345 1448550002 '{“lat": “35.681035","lng": “139.767712"}’ 10.02 3
123456789012350 1448550000 '{“lat": “141.354793","lng": “43.061421"}’ 0.00 4
123456789012350 1448550001 '{“lat": “141.354794","lng": “43.061422"}’ 0.01 5
123456789012350 1448550002 '{“lat": “141.354792","lng": “43.061420"}’ 0.02 6
123456789012355 1448550000 '{“lat": “127.679318","lng": “26.214472"}’ 15.00 7
123456789012355 1448550001 '{“lat": “127.679319","lng": “26.214473"}’ 15.01 8
123456789012355 1448550002 '{“lat": “127.679317","lng": “26.214471"}’ 15.02 9

最近のDynamoDBのキー名称の呼び方の変化について

DynamoDBでは以前はプライマリキーを構成するキーをハッシュキー、レンジキーと呼んでいました。
しかし、最近ではAWSマネジメントコンソール上で下記のようにDynamoDBの以前で言うハッシュキー、レンジキーの表記が変更されていますので注意が必要です。

ハッシュキー→パーティションキー
レンジキー→ソートキー

※AWS CLIやAPIなどでのパラメタ、返却値の仕様は従来通りハッシュキー(パーティションキー)はHASH, レンジキー(ソートキー)はRANGEが使用されています。
※AWSに問い合わせたところAWS CLI、APIレベルでの仕様変更は規模が大きため、変更の可能性はほとんどないそうです。

DynamoDBのプライマリキーについて

DynamoDBのプライマリキーには以下の2種類のタイプを設定できます。

ハッシュキー(パーティションキー): ハッシュキー(パーティションキー)のみで一意にデータを特定
ハッシュキー(パーティションキー)+レンジキー(ソートキー): ハッシュキー(パーティションキー)+レンジキー(ソートキー)の組み合わせで一意にデータを特定
※DynamoDBではプライマリキー、後述のローカルセカンダリインデックス、グローバルセカンダリインデックスを含め、レンジキー(ソートキー)でしかソートができない

プライマリキーが「ハッシュキー(パーティションキー)のみ」のタイプの検索例

  • テーブル項目のHash項目で一意にItemを特定できるデータ設計で用いる
  • 上述の例でいうとItemIDを「ハッシュキー(パーティションキー)」に指定した場合などが挙げられる
  • ItemIDで温度データを一意に特定できる

プライマリキーが「ハッシュキー(パーティションキー)+レンジキー(ソートキー)」のタイプの検索例

  • テーブル項目のHash項目だけでは一意にItemを特定できないが、Range項目を加えて検索することで一意にItemを特定できるデータ設計で用いる
  • 上述の例でいうとDeviceIDを「ハッシュキー(パーティションキー)」に、TimeStampを「レンジキー(ソートキー)」に指定した場合などが挙げられる
  • モバイル端末IDに対してタイムスタンプ時刻の温度データを一意に特定できる

DynamoDBのローカルセカンダリインデックスについて

DynamoDBのローカルセカンダリインデックスは以下の特徴を持っています。

  • テーブル作成時にのみ作成可能
  • プライマリキーが「ハッシュキー(パーティションキー)+レンジキー(ソートキー)」の時に作成可能
  • ローカルセカンダリインデックスはプライマリキーのハッシュキー(パーティションキー)に対して別のレンジキー(ソートキー)を追加するような形式のインデックス
  • 「ハッシュキー(パーティションキー)+レンジキー(ソートキー)」のタイプのプライマリキーとは違いローカルセカンダリインデックスのキー値は一意である必要はない
  • 1テーブルあたり最大5個のローカルセカンダリインデックスを作成可能

「ローカルセカンダリインデックス」の検索例

  • テーブル項目のHash項目だけではItemの絞り込みが難しい場合に、LSI項目を加えて検索することでItemの絞り込みを効率良く行うことを目的としたデータ設計で用いる
  • 上述の例でいうとプライマリキーにDeviceIDを「ハッシュキー(パーティションキー)」に、TimeStampを「レンジキー(ソートキー)」に指定した前提で、ローカルセカンダリインデックスにDeviceIDを「ハッシュキー(パーティションキー)」に、GPSInfoを「レンジキー(ソートキー)」に指定した場合などが挙げられる
  • モバイル端末IDに対してGPS位置の温度データ群を絞り込める

DynamoDBのグローバルセカンダリインデックスについて

DynamoDBのグローバルセカンダリインデックスは以下の特徴を持っています。

  • テーブル作成後でも作成可能
  • プライマリキーのタイプに関係なく作成可能
  • グローバルセカンダリインデックスは現状のプライマリキーに加えて別のプライマリキーを追加するような形式のインデックス
  • グローバルセカンダリインデックスは「ハッシュキー(パーティションキー)」のみのタイプ、「ハッシュキー(パーティションキー)+レンジキー(ソートキー)」のタイプ両方作成できる
  • プライマリキーとは違いグローバルセカンダリインデックスのキー値は一意である必要はない
  • 1テーブルあたり最大5個のグローバルセカンダリインデックスを作成可能

「グローバルセカンダリインデックス」の検索例

グローバルセカンダリインデックスが「ハッシュキー(パーティションキー)」のみの場合
  • テーブル項目のGSIのHash項目で一意にItemの絞り込みを効率良く行うことを目的としたデータ設計で用いる
  • 上述の例でいうとグローバルセカンダリインデックスにGPSInfoを「ハッシュキー(パーティションキー)」に指定した場合などが挙げられる
  • GPS位置の温度データ群を絞り込める
グローバルセカンダリインデックスが「ハッシュキー(パーティションキー)+レンジキー(ソートキー)」の場合
  • テーブル項目のGSIのHash項目だけではItemの絞り込みが難しい場合に、GSIのRange項目を加えて検索することでItemの絞り込みを効率良く行うことを目的としたデータ設計で用いる
  • 上述の例でいうとグローバルセカンダリインデックスにGPSInfoを「ハッシュキー(パーティションキー)」に、TimeStampを「レンジキー(ソートキー)」に指定した場合などが挙げられる
  • GPS位置に対してタイムスタンプ時刻の温度データ群を絞り込める
Reference: Tech Blog citing related sources