以前、FastAPIとReactとMongoDBの組み合わせについて紹介しました。
何故、MySQLなどのRDB系を使わなかったのかというと、最近はNoSQLを使う頻度が増えてきた為です。
NoSQL系のDBは他にも有名どことして、RedisやFirebaseのcloud firestoreなどがあります。
GCPだとCloud Datastore、AWSならDynamoDBにあたります。
NoSQLとは?
NoSQLはNot only SQLの略で、RDBMSではないものを指します。
NoSQL内でもデータモデルとアーキテクチャに着目して、分類することができます。
よく聞くものとして、キー・バリュー型とドキュメント指向型があり、今回のMongoDBはドキュメント指向型にあたります。
- キー・バリュー型
・Key:Valueを単位としてデータを格納する
・シンプルで応答がはやい - カラム指向型
・RDB系と同様にテーブル構造を持ち、カラム単位でデータを保持
・列単位の大量集計・更新が得意 - グラフ型
・ノード・リレーションシップ・プロパティによって出来るデータを一つの単位として扱う
・データ全体でグラフを生成 - ドキュメント指向型
・JSONのような構造を持ったドキュメントを単位としたデータ
・スキーマレス
NoSQLは高速な処理が可能で、RDBではデータ量が増えすぎてしまうと性能が劣化してしまいます。
最近は、ビッグデータを取り扱うことが増加してきているので、性能面で不安が残るRDBではなくNoSQLを採用するケースも増えています。
MongoDBの利点・RDBとの違い
RDBの場合は構造を変える場合にはテーブルの全ての行に対して操作をする必要がありますが、MognoDBはドキュメント型なので自由に変更することができます。
よくある、DBの仕様変更が起きた際に面倒な処理をすることなく、データベース構造を変更することができます。
RDBには当たり前にあるトランザクションやリレーショナルなどの機能がMongoDBにはありません。
最初は戸惑うかもしれませんが、デッドロックについて考えなくていいので開発しやすいDBです。
トランザクションなどの機能がない代わりに処理速度がはやいです。ただし、インメモリで動作するためメモリ以上のデータを処理しようとすると性能は落ちます。
MongoDBはレプリカセットという機能を有しており、3台以上のサーバを用意して常にデータの同期を取っておく仕組みがあります。
これによって障害発生時もすぐにレプリケーションをすることができます。
オートシャーディングによるオートスケーリングにも対応しているので容易にスケールアウトすることもできます。
RDBとの使い分け
基本データ系はRDBで管理し、データ量が多い行動ログなどはMongoDBを利用するといった形で、データによって使い分けるのはおすすめです。
単純に規模の小さいプロジェクトなら、RDBの代わりにMongoDBを使用してみることもできます。
もう一つおすすめの使い方が操作データログの蓄積です。
MongoDBをログストアに活用することは多くの企業でやっています。例えば、Webサイトの操作データログです。データサイズ制限のための「capped collection」や有効期限を超えたら自動的に削除される「TTL Collection」などの機能が実装されているので、設計しやすいです。