タイトル : DynamoDBをはじめよう キーの設計 localstackを試そう 2024
更新日 : 2025-01-01
カテゴリ : プログラミング
タグ :
aws   
python   
boto_3   
dynamodb   

AWS localstackを試そう 2024

DynamoDBをはじめよう

DynamoDBは、No-SQLです。RDBではありません。キーバリュー型のデータベースになります。

RDBだとテーブルの設計等からになりますが、DynamoDBだとキーの設計からですね。

キーの設計の前に、そもそもキーって?

キーってこんな感じなのかな~

  • プライマリキー

    RDBのプライマリキーは「パーティションキー」または「パーティションキーとソートキーの複合キー」になる。プライマリキーによって一意に識別される。

  • パーティションキー:HASH

    このキーへの格納値に従ってどのパーティションにデータが保存されるかが決まる。

    広範囲の値を持ちうるキーを設定することが推奨(各パーティションへのアクセスが均等に分散され、性能向上につながる)

  • ソートキー:RANGE

    各パーティション内のデータをソートすることが可能となる。

キーの設計

日付毎に、各店舗の各店員の各処理(全店舗でユニークIdを振る)を格納する。

データ 名称
日付 PDate
店舗ID ShopId
店員ID ClerkId
処理ID ProcId
処理内容 ProcContent

以下の方針で設計かな

  • 店舗毎より日付毎にデータを格納しておきたいので、パーティションキーは日付かな
  • プライマリーキー(パーティションキーとソートキーの複合キー)でデータを一意に決めるので、日付がパーティションキー、処理IDがソートキーかな
  • 店舗、店員でもデータを取得したいので、店舗、店員でグローバル セカンダリ インデックスを作るかな

上記を元にAWS CLIでテーブルを作成します

$ aws dynamodb create-table \
    --table-name ProcTable \
    --attribute-definitions \
        AttributeName=PDate,AttributeType=S \
        AttributeName=ProcId,AttributeType=S \
        AttributeName=ShopId,AttributeType=S \
        AttributeName=ClerkId,AttributeType=S \
    --key-schema \
        AttributeName=PDate,KeyType=HASH \
         AttributeName=ProcId,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=5,WriteCapacityUnits=5 \
    --global-secondary-indexes \
        "[
            {
                \"IndexName\": \"ShopIndex\",
                \"KeySchema\": [{\"AttributeName\":\"ShopId\",\"KeyType\":\"HASH\"},
                                {\"AttributeName\":\"ClerkId\",\"KeyType\":\"RANGE\"}],
                \"Projection\":{
                    \"ProjectionType\":\"INCLUDE\",
                    \"NonKeyAttributes\":[\"PDate\", \"ProcId\"]
                },
                \"ProvisionedThroughput\": {
                    \"ReadCapacityUnits\": 5,
        ]"  }   }   \"WriteCapacityUnits\": 5
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "PDate",
                "AttributeType": "S"
            },
            {
                "AttributeName": "ProcId",
                "AttributeType": "S"
            },
            {
                "AttributeName": "ShopId",
                "AttributeType": "S"
            },
            {
                "AttributeName": "ClerkId",
                "AttributeType": "S"
            }
        ],
        "TableName": "ProcTable",
        "KeySchema": [
            {
                "AttributeName": "PDate",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "ProcId",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2025-01-01T19:00:07.465000+09:00",
        "ProvisionedThroughput": {
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:000000000000:table/ProcTable",
        "TableId": "911b0519-4a36-4573-9b0b-26a3b20ac3c5",
        "GlobalSecondaryIndexes": [
            {
                "IndexName": "ShopIndex",
                "KeySchema": [
                    {
                        "AttributeName": "ShopId",
                        "KeyType": "HASH"
                    },
                    {
                        "AttributeName": "ClerkId",
                        "KeyType": "RANGE"
                    }
                ],
                "Projection": {
                    "ProjectionType": "INCLUDE",
                    "NonKeyAttributes": [
                        "PDate",
                        "ProcId"
                    ]
                },
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                }
            }
        ],
        "DeletionProtectionEnabled": false
    }
}
$

テーブル作成を確認

$ aws dynamodb list-tables
{
    "TableNames": [
        "ProcTable"
    ]
}
$ 

ちなみに削除は

aws dynamodb delete-table --table-name ProcTable

です。

aws cli で DynamoDB を使う