はじめに
Webサイト構築でよく利用されるのはMySQLだと思うのですが、私はこのタイプのデータベースにしか触れたことがありませんでした。
MySQLはいわゆるRDBMS(リレーショナルデータベース)で、行指向と呼ばれるDBです。1レコード(行)の中に、色んな情報が詰め合わさって、キーとなる項目で他のテーブルと紐づいてるやつです。
この思考のまま、業務で「AWS DynamoDB」を扱うことになったので、感じた事を記録していきます。
DynamoDBってどんなもの?
シングルテーブル設計
RDBMSは情報を管理する単位でテーブルを作成し、テーブルごとにエンティティがありますが、1つのテーブルに複数の異なるエンティティを含める思想です。テーブルごとに1つのエンティティを定義することもできますが、1つのテーブルに複数エンティティを含める事でパフォーマンスが向上するとのことです。
キーバリュー型
キー、バリューのような形で、単一の列のみを保持している。そうすると各々に紐づくキーの分だけ余計にデータ量が増えそうですが、列の同じ値は圧縮してデータを持てるので容量的には節約できるようです。
ドキュメント型
DynamoDBでは、JSONやXML形式で不定形な定義のデータを保持することができます。
pkとsk
pk – パーティーションキーと sk – ソートキーというキーがあり、これに紐づけて保存した型のデータ定義を作るので、感覚的には行指向と同じような感覚で取り扱い出来ました。列指向とは…?といまだ解せない感じです。誰か教えてください。
例えば下図のようにデータを追加していきます。属性名と値という形でpk,skに紐づけてデータを管理することができます。
pkとskの組み合わせで一意になる形です。一つのテーブルに違うエンティティを持っています。1,2行目はユーザ情報で、3,4行目は製品情報みたいな感じです。
pk | sk | name | status | price |
000001 | userInfo | 鈴木太郎 | active | |
000002 | userInfo | 山田優子 | active | |
C540123 | products | B5ノート | onSale | 200 |
C540225 | products | ボールペン | soldOut | 340 |
GSI
pkとskの他に、GSI – グローバルセカンダリーインデックスというものを定義することができます。pkとskだけだとデータを取り出したりするのに不便な時に使います。これをつけると料金がかかります。GSIは20個まで持つことが出来ます。GSIには、パーティーションキーと、オプションでソートキーを持つことができます。
5行目は同じテーブルに、注文情報を持たせた場合の例ですが、gsi1pkに注文者のpk、gsi1skには注文された日付を持たせてみました。特定ユーザの注文を抽出したり、注文日でなんかしたりしそうだからこの設定を例示しました。
pk | sk | name | status | price | gsi1pk | gsi1sk |
000001 | userInfo | 鈴木太郎 | active | |||
000002 | userInfo | 山田優子 | active | |||
C540123 | products | B5ノート | onSale | 200 | ||
C540225 | products | ボールペン | soldOut | 340 | ||
SC01293 | order | shipped | 000001 | 2024-12-14 |
データを取り出すときにpk,sk,GSIが重要になってくる
RDBMSではSQLで自由にデータが取り出しできます。どの項目もWhere句で複雑な条件で抽出することができますが、DynamoDBではそうはいきません。
DynamoDBでデータを取り出すときに指定できるのは、pk,skと、独自に追加したGSIだけなのです!!(衝撃)
pkは完全一致検索(=)しかできない
skで検索する時はpkと併用する必要がある(sk単体のクエリは不可)
skは =、<、<=、>、>=、Between、BeginWith(前方一致) が出来る
sk指定時はソートすることが可能
とりあえずルールがめんどくさいです。
これらを知ってないとテーブル設計も、機能設計も出来ないのですが、賢者に頼りながら設計しました。
DynamoDBどこがいいのか
とにかく読み書きが早いみたいです。インデックスにこだわってるから。そのかわりデータ全体のスキャンは遅いというか、全体をスキャンするような目的で使うなとも言えます。集計処理とかしたい場合はS3とかに吐き出したりしてAthenaで、などが良いかもです。
コスト面では、書き込み読み出しにお金がかかりますが、データ量は料金に影響しないしオートスケールされますので、大量データを蓄積し、決まった少量データのみを取り出すみたいなサービスに向いているのかなと思います。チャットアプリとか?
まとめ
DynamoDBはWebアプリの開発と相性がいい感じなのでしょうか。料金的にも。
奥が深すぎてまだつかみきれてませんが、知ったことをまとめました。
こちらのまとめが参考になります。