こんにちは、ささそらとです。
今回は、DynamoDBについて記載していこうかと思います。
MySQLやOracleなどのデータベースは、システム開発されたことのある方は馴染みがあったりするのではないでしょうか?
最近、AWSを触り始めた方などでDynamoDBってどういったものなのかな…って思われている方のお力になれたらと思います。
DynamoDBとは
まず、DynamoDBとは何かってところを書いていきます。
基本的には、よく使用する他のデータベースシステムと同じです。
テーブルを作成して、そこにデータを格納したり、更新したり、削除したりなどを行います。
ただ、DynamoDBはリレーショナルデータベースではなく、key-valueストアの方式のデータベースになります。KVSと呼ばれたりもします。
KVSの考え方は、キーと値の組み合わせでデータを保持しているデータベースシステムになります。javaでいうとmapのようなイメージです。
では、他のMySQLとかとDynamoDBはどのように違うのかを書いていきます。
まず、カラムが可変です。MySQLのリレーショナルデータベースですとはじめに必要となるカラムを全て定義した上でCREATE文を使用してテーブルを作成していくかと思います。
DynamoDBは、はじめのテーブル作成はキーのみで作成され、データを追加するときにカラムが追加されます。
ですので、レコードによってAカラムはあるがBカラムがないって状態が普通にできたりします。
後は、リレーショナルではありませんので、他のテーブルとの結合ができません。
他にもキー以外の条件抽出ができません。(SDKを使用すればできなくはないですが、内部的には一旦、全件取得してメモリ内に入れてから必要なものを抽出している形になります。)
注意点
簡単に注意点を記載していきます。
まず、データベース設計について記載していきます。実際に私が経験してみて感じた内容を書いていきます。
リレーショナルデータベースですと、どういったデータを管理していくかで設計を行っていくかと思います。
その上でデータの保守性や拡張性を考慮して、正規化を行って各テーブルの関係性を設計し、ER図なども作成していくことになります。
DynamoDBで設計を行う場合は、これらの考え方とは違うやり方になります。基本1つのテーブルにまとめた方が良いです(初めて携わったときは衝撃を受けました)
DynamoDBの場合は、どのようなデータを管理するかというよりも、どういった取得を行うかなどのユースケースによって設計する必要があります。
先ほど、記載しましたが、条件の抽出がキーでしかできないため、リレーショナルデータベースとは異なり好きなカラムでの検索がしにくいです。
後、結合ができないため、テーブルを分ければ分けるほど処理がし難くなります。(Lambdaなどの処理側で何度も取得処理を書く必要が出てきてしまいます)
ですので、どういった取得があるのかを意識してどういったキーを設計する必要があるかが重要になってきます。
AWSサイトにもリレーショナルデータベースとKVSとの設計比較例が載っていますので一度参考にしていただけたらと思います。
まとめ
簡単にですが、DynamoDBについて記載してみました。
KVSに馴染みのない方だと中々設計が難しいと感じることもあるかと思います。
ただ、ベストプラクティスでないにしろ、リレーショナルデータベースのような使い方もできなくはないので、一度試してみてはいかがでしょうか?
おそらく使用していく中でリレーショナルデータベースとのギャップを感じることができるかと思います。
私は以下を感じました。
- 条件取得が自由にできない
- 結合ができない
- トランザクションがはりにくい
実際に使用してみた方が理解もしやすいかと思います。
コメント