タイトル : DynamoDBをはじめよう キーの設計 localstackを試そう 2024
更新日 : 2025-01-01
カテゴリ : プログラミング
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
です。