WEB

行指向から列指向へ。AWS DynamoDBに触れてみた。

はじめに

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アプリの開発と相性がいい感じなのでしょうか。料金的にも。

奥が深すぎてまだつかみきれてませんが、知ったことをまとめました。

こちらのまとめが参考になります。

reiko suzuki
OLD SKOOLシステムエンジニア。ねこを撫でながら働いています。