DynamnDBって、RDB長くやっている人ほど、なんか理解できない、話はわかるけど腑に落ちない存在だったりしませんか?
自分はこうやってDynamoを理解しました。正確にあっているかは自分でもわからないです。なかなか、説明を読んでも腑に落ちない人向けの記事なので、正確に理解している方は読む必要なしでしす。
さて、DynamoDBでググると、以下のようなイメージで書かれていることが多いと思います。
・DBにはカラムを定義する
・その中の特殊なカラムとしてパーティションキーとソートキーなるものが存在する。
・この二つを組み合わせてプライマリキーとする。パーティションキーだけでもプライマリーキーとして使用可能
・通常のSQLは使えない
・プライマリーキーでレコードを特定する
通常のRDBを長くやっていると、まずこの言葉遣いで混乱するし、全然イメージが沸かない。個人的にはプライマリキーという言葉は使わない方がいいとさえ思う。
自分が人にDynamoの説明をするときには、あえて以下のような説明を行います。
・DBと言いつつ、限りなくハードディスクのようなもの、Cドライブとか
・パーティションキーというのは、ディスク直下のフォルダだと思って
・ソートキーというのはその中に入っているファイル名
つまりDB内の1つのファイルを探すには、フォルダ名とファイル名の2つが決まればいい。逆に、この条件でしか調べられないからSQLは使用できない
まあ、誤解を覚悟の上で言えば、SQLは使えないけど、フォルダサーチはできて、かつ、その中のファイル一覧は持ってこれるという仕様なのです。(ソートも可能)
ソートキーがない場合は、パーティションキーだけでプライマリキーになるというのもこのあたりの仕様が理由です。
それと理解しておきたいのはDynamoに物理的なテーブル定義が存在しない点です。もちろんテーブル定義は作成できるけど、それはあくまで論理的なもので、こうやって使うぞ!と自主的に決めるテーブル定義となリます。
実際にAWSのDyanmoのコンソールを見れば、テーブル定義は作れないことがわかると思います。逆に好きなカラム名のデータを自由に入れることができる。
その中で唯一テーブル定義的な存在がパーティションキーとソートキー
もう少し、パーティションキーの説明をします。
パーティションキーの値によって、格納される物理DBは異なります。
??DBは1つじゃないの???
ここがDynamoDB理解の肝なのですが、使用されるレコードは1つの物理的なユニットに全部収められているのではなく、パーティションの値次第で物理的に別のDBに納められている模様
いや、実際にAMAZONの社内で調べたわけではないけど、そうゆう話が流布されてます。
つまり、パーティションによって、物理的には別DBに入っているということです。
パーティションキーA は 物理DB Xに入る
パーティションキーB は 物理DB Zに入る
みたいです(実際には物理DBというより物理ディスクといったほうがいいのかもしれないです。実際に見たことはないけど複数のマシンであるとは思う)
このようなDB分割方法を水平Shardと言うらしいです。データの中の特定のカラム(パーティションキー )の値によって格納するDBを分散させようという考え方。
これによって大量のデータを分散処理することは可能になりますが、RDBの利点が失われます。SQLが使えないとかね。
なのでShard万能ではなくて、むしろ使える局面が限られます。
おそらくDynamoDB使って会計システム作る人はいないです。
ざっくり理解するための記事ですので、この辺りで終わりにしますが、詳細はこのあたりとか読んでみると良いかもしれません。
https://www.alexdebrie.com/posts/dynamodb-partitions/