DynamoDBのグローバルセカンダリインデックス:完全ガイド
ハッシュと範囲主キー:Amazon DynamoDBの基礎
Amazon DynamoDBは、NoSQLデータベースサービスの一つで、キーと値のペアを保存するシンプルなデータモデルを提供します。データの保存と検索には、ハッシュと範囲主キーと呼ばれる2つの重要な概念が用いられます。
ハッシュ主キー
ハッシュ主キーは、一意の識別子をハッシュ関数で処理し、その結果に基づいてデータをパーティショニングします。ハッシュ関数は、入力値を一定長の出力値に変換する関数です。ハッシュ主キーを使用すると、データがDynamoDBのノードに均等に分散されるため、スケーラビリティとパフォーマンスが向上します。
範囲主キー
範囲主キーは、ハッシュ主キーと組み合わせることで、データのサブセットをさらに分類するために使用されます。例えば、ハッシュ主キーがユーザーID、範囲主キーがタイムスタンプだとすると、特定のユーザーの投稿を時間順に並べ替えることができます。
ハッシュと範囲主キーの利点
- データのスケーラビリティとパフォーマンスの向上
- データの効率的な検索
- クエリのパターンに合わせたデータのパーティショニング
- ハッシュ主キーは一意である必要があります
- 範囲主キーはハッシュ主キーと組み合わせて使用される必要があります
- ハッシュ主キー:ユーザーID
- 範囲主キー:タイムスタンプ
この例では、ユーザーIDに基づいてデータがパーティショニングされ、タイムスタンプに基づいてユーザーの投稿が時間順に並べ替えられます。
import boto3
# DynamoDBクライアントの作成
client = boto3.client('dynamodb')
# テーブル名
table_name = 'MyTable'
# ハッシュ主キー
hash_key = 'user_id'
# 範囲主キー
range_key = 'timestamp'
# データの追加
item = {
hash_key: '12345',
range_key: '2023-03-08T12:00:00Z',
'data': 'This is some data'
}
client.put_item(TableName=table_name, Item=item)
# データの更新
item['data'] = 'This is updated data'
client.update_item(TableName=table_name, Key={hash_key: '12345', range_key: '2023-03-08T12:00:00Z'}, AttributeUpdates={'data': {'Value': 'This is updated data'}})
# データの削除
client.delete_item(TableName=table_name, Key={hash_key: '12345', range_key: '2023-03-08T12:00:00Z'})
# データの検索
response = client.query(TableName=table_name, KeyConditionExpression=Key(hash_key).eq('12345') & Key(range_key).between('2023-03-08T00:00:00Z', '2023-03-08T23:59:59Z'))
items = response['Items']
# 検索結果の処理
for item in items:
print(item)
このコードは、Pythonのboto3ライブラリを使用してDynamoDBにアクセスします。
put_item
メソッドは、DynamoDBに新しい項目を追加します。update_item
メソッドは、既存の項目を更新します。query
メソッドは、項目を検索します。
ハッシュと範囲主キー以外のDynamoDBのデータ保存方法
ソートキー
全ての属性を主キーとして使う
ハッシュ主キーと範囲主キーを使用しない場合は、すべての属性を主キーとして使用することができます。ただし、この方法はデータのスケーラビリティとパフォーマンスに影響を与える可能性があります。
GSI (Global Secondary Index)
GSIは、ハッシュ主キーと範囲主キーとは異なる属性に基づいてデータを検索するためのインデックスです。GSIを使用すると、ハッシュと範囲主キーでは不可能なクエリを実行することができます。
Local Secondary Index (LSI)
LSIは、ハッシュ主キーと範囲主キーに基づいてデータのサブセットを検索するためのインデックスです。LSIは、GSIよりも制限が少ないですが、パフォーマンスとコストの面でメリットがあります。
どの方法を選択するべきか
どの方法を選択するべきかは、データの性質とアプリケーションの要件によって異なります。
- ハッシュと範囲主キーは、最も一般的な方法であり、多くのユースケースに適しています。
- ソートキーは、データのサブセットをさらに分類するために使用できます。
- すべての属性を主キーとして使用するのは、データ量が少ない場合にのみ適しています。
- GSIは、ハッシュと範囲主キーでは不可能なクエリを実行するために使用できます。
- LSIは、パフォーマンスとコストの面でメリットがあります。
hash amazon-dynamodb primary-key