DynamoDBのグローバルセカンダリインデックス:完全ガイド

2024-07-27

ハッシュと範囲主キー: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

hash amazon dynamodb primary key

PHPのpassword_hash()関数を使ってパスワードを安全にハッシュ化・ソルト化する

さらに、ハッシュ化処理にランダムな文字列であるソルトを追加することで、パスワードの安全性をさらに高めることができます。ソルトを追加することで、同じパスワードでも異なるハッシュ値が生成されるため、レインボーテーブル攻撃などの攻撃を防ぐことができます。


JavaでMD5ハッシュを生成するコードの解説

MD5ハッシュは、ファイルやテキストの指紋のようなもので、その内容が変更されるとハッシュ値も変わります。Javaでは、MessageDigestクラスを使用してMD5ハッシュを生成することができます。MessageDigestオブジェクトの取得:MessageDigest md = MessageDigest