1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DynamoDB テーブル設計 ベストプラクティス

Last updated at Posted at 2023-02-08

概要

DynamoDB のテーブル設計についてベストプラクティスが公式で紹介されているがわかりづらいので解釈入れてメモ。
なお、以下ではパーティションキーをPK、ソートキーをSKと記載する。

ソートキーでバージョンコントロール

SK で履歴が判るようにする。
参考: ソートキーを使用してデータを整理するためのベストプラクティス - Amazon DynamoDB
image.png

スパースインデックス

値が欠けているレコードは除外してインデックスを作れる。これがスパースインデックス。
関係ないレコードを除外できるので高速なクエリが可能。
参考: スパースインデックスの利用 - Amazon DynamoDB

image.png
上記テーブルで Award のカラムを PK にして GSI を作る。
image.png

集計値を同じテーブル内に

同じテーブルで管理することでコンセプトをテーブル単位に管理でき、プロビジョニングしている環境に相乗りできる。
参考: マテリアライズされた集計クエリでグローバルセカンダリインデックスを使用する - Amazon DynamoDB

image.png

GSI の多目的利用

Sort Key を用途名にすることで、1つの GSI を多目的に利用できる。
(GSI は 20 しか張れないが、この技でそれを超えた用途を適えることができる。)
参考: グローバルセカンダリインデックスの多重定義 - Amazon DynamoDB

※以下、Partition Key を PK, Sort Key を SK と記す。

GSI の PK として「Sort Key」を、GSI の SK として「Attribute 1」(Data) を指定。

  1. PK="Employee_Name" and SK=ユーザ名 ⇒ 特定ユーザに紐つくデータ抽出
  2. PK="Warehouse_01" (Warehouse ID) ⇒ 特定倉庫で働く全ユーザ名、employee ID 抽出
  3. PK="HR_confidential" and SK="2008-11-08" (勤務開始日=Start) ⇒ 指定期間に雇用した employee ID 取得

image.png

シャーディング

ランダム値を PK にすることで分散させて高速に目的のレコードを抽出。
参考: 選択テーブルクエリでグローバルセカンダリインデックス書き込みシャーディングを使用する - Amazon DynamoDB

0~N のランダム値を PK に持つ GSI を作り、0~N を並列でデータ取得する。
CRITICAL な特定日付範囲の情報を高速に取得可能。

image.png

時系列データ

日付ごとにテーブルを分け、頻繁にアクセスする当日のデータに集中できるようにする。
古いデータはもはや書き込まれないので、プロビジョニングされた書き込み容量を小さい値 (1 WCU など) に減らすことが可能。削除することも可能。

参考: DynamoDB で時系列データを処理するベストプラクティス。 - Amazon DynamoDB

image.png

多対多

GSIを使うことで多対多は簡単にできる。
参考: 多対多の関係を管理するためのベストプラクティス - Amazon DynamoDB

image.png

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?