BBH
-Biz Branding Hub-
投稿日 : 
2019/11/11
更新日 : 
2019/11/11

【AWS】DynamoDBをパーティションキーで検索する

AWS DynamoDBをパーティションキーで検索するサンプルを紹介します。

DynamoDBのキーについて

まずは、簡単にDynamoDBのキーの仕組みについて説明します。
DynamoDBには主キーを作成することができます。
主キーは、単一主キーと複合主キーの2種類があります。

例えば、商品IDなどで必ず一つのものを引く場合は、単一主キーで事足ります。
しかし、商品カテゴリなどでも引きたい場合は、商品IDと商品カテゴリの複合主キーを張る必要があります。
商品カテゴリに主キーを作らなくても検索はできますが、キーが無い=全件走査が行われるということになるので、性能が著しく劣化します。
頻繁に検索に使われるカラムはキーとしましょう。

また、キーは作成できる数に制限があります。
DynamoDBでは、複合主キーで最大2つまでしかキーを張ることができません。
なので、よく考えて性能が出るようにキーを張ってやる必要があります。

複合主キーはパーティションキーとソートキーから成ります。
パーティションキーは単一で検索が可能ですが、ソートキーは単一での検索はできません。
パーティションキー+ソートキーでの検索なら可能です。

そのため、複合主キーはある程度まとまったグループで検索される場合に使用されます。
例えば、商品カテゴリなどが考えられます。

パーティションキーでDynamoDBを検索する

では、実際にパーティションキーでDynamoDBを検索するサンプルを見てみます。
サンプルはpythonで作成しています。

DynamoSample.py

import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')

def get_records_by_partitionKey(keyName, keyValue, tableName):
    table = dynamodb.Table(tableName)
    
    try:
        response = table.query(
        KeyConditionExpression=Key(keyName).eq(keyValue)
        )
    except Exception as e:
        print('DynamoDBアイテム取得処理でエラーが発生しました。TableName={0}, Key={1}, Value={2}'.format(tableName, keyName, keyValue))
        print(e)
        return []
    
    if(response['ResponseMetadata']['HTTPStatusCode'] != 200):
        print('DynamoDBアイテム取得処理でエラーが発生しました。' + \
            'TableName={0}, Key={1}, Value={2}, StatusCode={3}'.format(tableName, keyName, keyValue, response['ResponseMetadata']['HTTPStatusCode']))
        return []

    items = response["Items"]
    print('get_records_by_PartitionKey戻り値={0}'.format(str(items)))
    return items  # 取得結果が無い場合は、空の配列を返却される

keyName, keyValue, tableNameはすべて文字列型です。

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend