こんにちは!
昨今では、サーバーレスの開発プロジェクトが増加したのに伴い、DynamoDB を使用した開発案件が大変増えてきました。わたしたちがDynamoDBの設計を行う際、NoSQLワークベンチではデータベース全体の俯瞰・把握が難しいため、独自に作成したDynamoDBのフォーマットを使用しお客様のサーバーレスプロジェクトを支援しています。
お客様のビジネスの要件定義をもとにデータモデリングを行う際、Swagger のようにコード上でデータアクセス定義ができたらなぁ…という思想から採用しました。(スプレッドシートの管理に限界を感じました…)
NoSQLWorkBench をまだ使用されていない方は、是非一度ダウンロードして使ってみてください!
本記事では、DynamoDB の設計で必須となる「ファセット」というデザインパターンについて解説をしていきます。
ファセットは、GSI、LSI のような DynamoDB の機能ではありません。後述で詳しく解説していきます。
DynamoDB の設計を行う際、スキーマレス、パーティションキー・ソートキーの特性を活かした以下の設計思想が望ましいとされています。
特にRDB出身の方はテーブルを正規化しがちですが、DynamoDBではできるだけ少ないテーブル数のほうが望ましいとされていますので注意しましょう。テーブル数を少なくすることで、DB構造の簡素化、バーストアクセス時のスペック調整の容易にすることができます。
その最小のテーブル数を実現するために、必須のテクニックが「ファセット」となります。
尚、DynamoDBのデザインパターンに関するAWSドキュメントはこちらをご覧ください。
例えば、EC サイトでユーザーのプロフィール情報と、ユーザーの商品お気に入り情報を保持するテーブル構造を考えてみましょう。
ユーザーのプロフィール情報
{
customerId: '0001',
customerName: '田中太郎',
email: 'yamada@example.com'
}
ユーザーのお気に入り商品情報
{
customerId: '0001',
favoriteProductId: '12345'
}
上記の2つのデータの格納を考えた場合、RDB脳だと「users」「user_favorites」的な2つのテーブルを考えるはずです。
しかし、DynamoDBでは以下のように考えます。
後述で具体的なDynamoDBの設計を解説しますが、まずここで肝心なのは、DynamoDB はインデックス属性以外はスキーマレスということです。簡単に言えばデータ構造の決まっていないJSONデータをバシバシいれることができるとうことです。ここで、JSONを無作為に挿入したら何のデータなのかデータの管理がしにくいのでは?と考えると思います。
ここで登場するのがファセットです!
まず、User テーブルに格納したい情報を、 2 つの分類に分けることができます。
上記の2つの情報を以下のようにDynamoDBでは設計することが出来ます。
属性名 | Key type |
customerId | パーティションキー |
type | ソートキー |
プロフィールファセット
{
customerId: '0001',
sortKey: 'profile',
customerName: '田中太郎',
email: 'yamada@example.com'
}
{
customerId: '0001',
sortKey: 'favoriteProduct',
favoriteProductId: '12345'
}
上記のデータ構造を見ると、「sortKey」という属性が追加されていると思います。この「sortKey」の値で、そのItemが、何の情報なのかをわかるようにします。
前述の例の場合以下のようになります。
sortKey | 何の情報? |
profile | ユーザーのプロフィール情報 |
favoriteProduct | ユーザーのお気に入り商品情報 |
前述のように、一つの属性の値次第でそのItemの解釈を変更する手法を、オーバーローディングと言います。
つまり、sortKeyの値によって、Item の意味が異なることになります。 今回の例では sortKey がオーバーロードされた属性です。
開発が進んでいけば、今回の sortKey のようなオーバーローディングテクニックを使用したテーブルもいくつか発生することがあるので、ファセットは確実に設計するようにしましょう。( わたしたちは独自のDynamoDB用の設計フォーマットを用いて設計を行います )
正しくファセットを設計することで規模がスケールしても、保守性高くチーム開発がしやすくなります。
RDBでも同じことが言えますが、開発が進むに連れて DynamoDB も、テーブルがどんな情報を格納しているのかを識別するのがだんだんと複雑になってきます。
設計者は、テーブルにどのような情報が格納されているのか視覚的に判断できるよう、DynamoDB 設計の際には必ずファセットを使用しましょう。
DynamoDB の設計・サーバーレス開発は、お気軽にご相談ください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎