技術選定のためNoSQLデータベースについて調査しました。
**2019年加筆
**NoSQLと一括りに書いてしまっていましたが、調査したのはRedisなどKeyValue系のNoSQLではなく、MongoDBなどDocument指向系のDBです。
MySQLなどのRDBMSとどちらを選ぶかにあたっての主な疑問点に関しての回答をまとめます。
##NoSQLとRDBMSどっちがいいの?
よほどスケールするのでなければRDMBSが良い。
##NoSQLのメリットは?
- 水平分散が可能でスケールする。
- スキーマを定義せず柔軟にデータを入れられる。
##NoSQLのデメリットは?
- RDBMSに比べてアプリケーションレイヤーの複雑さが桁違いに上がる。
- データの整合性を保証できない。
- スキーマを定義できない。
##RDBMSだと何故水平分散ができないのか?
データの整合性を取る必要があるため。複数のサーバー間で同時に同じデータへの書き込み処理があった場合にデータが矛盾してしまうので、書き込みを許可できるのはマスターサーバー一つのみ。読み取りは分散できる。
##何故NoSQLでは水平分散が可能か?
データの整合性を諦めたためどのサーバーも書き込み可能。データがコンフリクトしようがデータをサーバー間で同期する。
##NoSQLを使うと複雑になる要因は?
- データの整合性が取れない可能性を考慮したアプリケーション設計。
- RDMBSでは決してしないデータの二重管理の考慮。
- DBではなくアプリケーションレベルでのValidation考慮。
- スキーマレスなデータに対する適切な処理の考慮。
##NoSQLはどう設計するの?
NoSQLのコレクション-ドキュメント志向に沿うなら以下の3ポイント。
- ジョインリクエストができないので一度にデータを取得できるようにデータを持つ。
- データを重複して持つことを許容する。
- データを更新する場合は重複したデータに対してそれぞれ更新リクエストをかける。
##NoSQLは何故早い?
- 水平分散ができるため
- トランザクション、バリデーション、JOINなどの便利な処理を全て捨てたため。
2に関してはアプリケーションレイヤーで捨てた機能を考慮した処理を書き直す必要があるのであまり意味がない。
##NoSQLとRDBMSの技術的トレードオフは何?
データの整合性とスケーラビリティー(水平分散)
##トレードオフは乗り越えられないの?
Googleが去年Clound Spannerというトレードオフを乗り越えたRDBMSを出した。
##NoSQLで使えるDBは?
Googleのfirestore(まだβ版)がデータの整合性を取れるNoSQL。
##リアルタイムデータベースはどうなん?
データの整合性には少し不安があるようだが、優れた点が多い。
Firestoreの方が値段高い場合があるけど基本良さげ。
詳細比較
##MongoDBはどうなの?
個人的には選択肢には入らない。
##結局あんたどのDB使うん?
Firestoreをメインに部分的にMySQLを活用する予定。
##終わりに
誤りやより深い議論があればコメントいただけると助かります。
###参考文献
F1: A Distributed SQL Database That Scales
Consistency Issues on NoSQL Databases: Problems with Current Approaches and Possible Solution(s)
Clound Firestore
Clound Firestore vs Realtime Database