DynamoDBについて
最近DynamoDBを触っているので感想
グローバルセカンダリインデックスなどNoSQLを補完する機能があるが本質的にはストレージがNoSQLデータモデルのため、不必要にリレーショナルなデータモデルを実現出来そうな雰囲気を感じさせるのがあまりよくない
仕組み的には複製されたデータを用意しそちらに別のインデックスを作成しているだけなので実質的にWork Aroundであり、本質的な解決方法ではない
インデックスを増やしたらその分書き込みが2倍3倍となってスループットが落ちる
MapによるJSON的な階層構造が出来てしまうことも本質的にはリレーショナルではないけどドキュメントDB的な使い方も可能になってしまう
これらが難しいのは不必要に「出来そう」と思わせてしまうところであり本来ならRDBMSで実現するべきデータをDynamoDBで実現してしまうような危険性を孕んでいる
データ構造を1テーブルか2テーブルに非正規化出来、かつWrite性能のスケールが必要な場合には向いているがそうでない場合ほとんどのデータ構造はリレーショナルなため全てのユースケースに適用できるわけではない
ワークロードを特定しWriteに対して強いresilienceを求められ、かつそのワークロードが集中するデータモデルが非正規化可能なモデルのときに適用可能
まずワークロードを特定しないと正しい設計を行えないため寿命の長いアプリに使うのは相当注意深くワークロードを事前に設計しないと厳しい
NoSQLは設計しなくていいDBではなくスキーマの決定をWrite時に行えるだけで入ってくるスキーマを設計しないでいいわけではない
ある程度特定していることが前提でその上で全く予想が出来ないようなスキーマでデータが入ってくるような場合に有効になる
事前に交渉出来たり入ってくるスキーマを限定出来るならSchema on Writeで行う必要はない
なぜ出来そうに見えるのが悪いのかというとそれが出来るということはそれを使うのに最適ということを意味しないから
原理的に向いていないものは向いていないとばっさり切るべきで下手に出来ると言ってしまうのはあまりいい態度とは言えない
そういう意味ではRedisなどは自分が得意なことと機能として出来ることが一致しているという点で誠実だと思う
NoSQLのデータモデルが得意とするモデルと提供しているインターフェースとしてのAPIが一致しているため利用者が間違って使うインピーダンスミスマッチが起こりづらい