Open20

DynamoDB設計 キャッチアップ

ryosuke-horieryosuke-horie

押さえておくべきDynamoDB設計(ベストプラクティス) まとめ

https://elastictechdays.info/dynamodb-design/

DB設計は必ずアクセスパターン(仕様)が決まってから着手すること
でないとDB設計根本から変更することになる
つまり運用は楽になるかもだけど、開発時に考え抜いて設計要

Primary Key

データはPartition Key(PK)、または PK と Sort Key(SK)の組み合わせで識別される。= Primary Key
テーブル数を少なく設計する。

テーブル数

少ないとキャパシティユニットを最適化できる
関連するデータをまとめとくと応答時間短縮に繋がる。←「参照の局所化」

設計が優れたアプリケーションでは、必要なテーブルは 1 つのみです。

インデックス設計

なのでアクセスパターン要件の洗い出しが完了するまでDynamoDB設計に取りかからない

GSIオーバーローディング

Query対象が増えた時のために1つのGSIに複数の検索要件を持たせる。

Composite Key (キーの結合)

より効果的なセカンダリインデックスキーを実現。
クエリを最適化したい場面で効果的。

注意点

  • 外部結合ができないため複雑な検索がにがて
  • PKは完全一致、ソートがSort Keyでないとできない
  • 検索条件が増えるとその分のデータが増えることが多い
ryosuke-horieryosuke-horie

DynamoDB設計のちょっとした技

https://www.slideshare.net/rs_wisteria/dynamodb-248312961

  • 異なる用途で同じグローバルセカンダリインデックスを利用する
    • 同じ検索方法(完全一致、部分一致、範囲指定)なら同じGSIを使う
  • ソートキーに複合情報を持たせる
    • データタイプ+日時など
    • 前方一致で検索できる
  • 無効なデータをインデックスせず、GSIのインデックスを小さく保つ
    • ランキング上位5件とか
ryosuke-horieryosuke-horie

DynamoDBのテーブル設計に最適!NoSQL WorkbenchのData modelerで今度こそDynamoDBを使いこなす!

https://dev.classmethod.jp/articles/dynamodb-nosql-workbench-datamodeling/

  • 「NoSQL Workbench」を使うことで設計が正しいか検証可能
  • ER図を作成する
  • 多対多の関係なら「隣接関係のリスト設計パターン」
  • 「ユースケース/アクセスパターン列挙->NoSQL Workbenchで設計->データ投入->検証->設計修正」のサイクルを何度か実施するのが効率良さそう
  • 設計原則としてユースケースの洗い出しが重要
    • LSIやGSIが必要なので重要
  • NoSQL Workbentchを使用
    • テーブル設計の作成
  • 終わった後にはまる設計を構築するのに時間がかかる
ryosuke-horieryosuke-horie

多対多の関係を管理するためのベストプラクティス

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html

隣接関係のリスト設計パターン

  • より一般的には、DynamoDB のグラフデータ (ノードとエッジ) を表現する方法
  • 最上位エンティティ (グラフモデル内のノードと同義) はすべて、パーティションキーを使用して表現されます
  • 他のエンティティとの関係 (グラフのエッジ) は、ソートキーの値をターゲットエンティティ ID (ターゲットノード) に設定することによって、パーティション内の項目として表現
  • メリット
    • ターゲットエンティティ (ターゲットノードへのエッジを含む) に関連するすべてのエンティティ (ノード) を見つけるために重複データを最小限に抑えられること
    • クエリパターンを簡素化できる

マテリアライズされたグラフパターン

ryosuke-horieryosuke-horie

DynamoDBで多対多のテーブル設計

https://hack-le.com/dynamodb-many-to-many/

  • 上のドキュメントの補足

  • ユーザーとグループをDynamoDBで実現する例

  • Adjancy List Design Pattern(隣接リストパターン)

    • PK=SK(GSI-PK)=user_idのとき、ユーザーを示す。
    • PK=SK(GSI-PK)=group_idのとき、グループを示す。
    • PK=user_id, SK(GSI-PK)=group_id のとき、user_idに所属するグループを示す。
      • つまり、group_idに所属するuser_idの数だけ冗長である
  • クエリが簡単になる

    • PK=SK=user_id としてget_itemしたら良い。任意のグループの詳細情報であれば、PK=SK=group_id
ryosuke-horieryosuke-horie

DynamoDB でリレーショナルデータをモデル化するための最初のステップ

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-modeling-nosql.html

  • DynamoDB の場合は答えが必要な質問が分かるまで、スキーマの設計を開始しないでください。ビジネス上の問題とアプリケーションのユースケースを理解することが極めて重要
  • 設計の手順
    • 新しいアプリケーションの場合は、アクティビティや目的に関するユーザーストーリーを確認します。特定するさまざまなユースケースを文書化し、必要なアクセスパターンを分析
    • 既存のアプリケーションでは、クエリログを分析して、ユーザーが現在どのようにシステムを使用しているか、主要なアクセスパターンを調べます。
  • 本番環境で見つかる可能性のあるクエリパターンの複雑さの範囲を表します
ryosuke-horieryosuke-horie

DynamoDB の設計について考えてみる。

https://qiita.com/_kensh/items/2351096e6c3bf431ff6f

  • DynamoDBのモデリングプロセス
    • 業務分析とデータモデリング
    • アクセスパターン設計
    • TableとIndex設計
    • クエリ条件設計
    • 追加条件が生じたら?
      • サービスに合わせてテーブル・インデックス設計を変更
      • 他のサービスと連携する