それぞれの特徴
リレーショナルDB(MySQL) | ドキュメントDB(MongoDB) | |
---|---|---|
データ構造 | テーブルという表計算ソフトのような構造 正規化という手法を用いて適度に重複が発生しない構造(テーブル)を事前に定義する 正規化は1-3段階まであり厳密な設計思想が存在する | JSON形式 スキーマレスなので事前に全ての定義をする必要はない 緩やかな設計思想で、JSONのモデリングを行う 主キーは自動採番で後からインデックスの設定もできる 遅いけどコレクション結合もできる |
処理速度 | インデックスの効率に依存する 細かいメモリチューニングができる HDDに書き込むオーバーヘッドがある | インデックスはRDB同様に利用できる インメモリで動くためオーバーヘッドが少なく高速 データの集計などの単純計算はRDBよりも高速にできる |
特性 | ☆ACID特性という原則を守る事ができる ※ とても厳格なので金融や基幹システムなどに向いている | ☆Base特性という原則を守る事ができる ※ ゲームのセーブデータや粒度の細かい操作ログ記録などに向いている |
分散性 | NDBクラスタという特殊なテーブルを使う以外には基本的にレプリケーションを利用した読み込み分散のみ | シャーディングとい機能を利用して書き込み分散ができる |
分散化アーキテクチャ
※ MongoDBレプリカセットの話は一旦省略しています
くしくは、こちらをご覧ください
SQL構文の比較
スキーマレスなので、テーブルの設計が不要になり、カラム長の変更や追加削除が用意になる反面、取り出す時の対応をきちんとしないと、null参照によるエラーが発生しやすくなるので注意して利用してください
MySQL | MongoDB |
---|---|
1. スキーマ定義 create table customers ( id number(10) not null primary key, name varchar(40) not null, tell varchar(40) not null, ) 2. データの投入 insert into customers(id, name, tell) values(null, ‘test’, ‘080-0000-0000);’ 3. カラムを増やす alter table customers add address column varchar(255); 4. データの投入 insert into customers(id, name, tell) values(null, ‘test’, ‘080-0000-0000);’ |
1. コレクション定義 db.createCollection( "customers") 2. データを入れる db.customers.insert([{name: ‘test’, tell: ‘080-0000-0000’}]) 3. カラムを増やしてデータを入れる db.customers.insert([{name: ‘test’, tell: ‘080-0000-0000’,address:’Tokyo’}]) |
利用例
MySQL | MongoDB |
---|---|
□ECサイトなどの商品管理 重複なく設計されたマスタ系のデータテーブルを保管して参照する □銀行システム 厳格なトランザクションの下で、入金、出金、振り込みなどの操作を行わなければならない |
□大量のログ保管 ヒートマップデータやアプリ操作ログなどの保管や統計的集計 □ゲームのセーブデータ 特定個人のプレイデータで厳密排他制御の必要性がない |
Railsを利用しないアーキテクチャ例(MongoDB)
マイクロサービスで情報の蓄積 | 閲覧にはクライアントツールを使う |
---|---|
☆例: 視聴ログなどの蓄積にマイクロサービスを利用する ■AWS MongoDB Atlas serverless architecture Awsを利用したマイクロサービスのアーキテクチャ ■Atlas Microservices with MongoDB Atlas MongoDBの提供するマネージドサービス |
☆例: 蓄積されたデータの閲覧ツールを実装せずに閲覧する ■ Studio Studio 3T(GUI client) MySQLだとnavicatというツールがあるがそれと同じもので クエリさえ分かればデータが引き出せるというもの ■HumongouS.io HumongouS.io(Web GUI ) 上記のWeb版 |
積極的に活用していきたい新機能
ジオコーディング
MySQL | MongoDB |
---|---|
MySQLにも空間データを扱う型が存在します、PointやPolygonなどの複雑なGeometoryもサポートしています 空間データ型 緯度経度 |
MongoDBでは、複雑なGeometry(点、直線、多角形)をlon/latで扱うものと、2Dの座標空間を扱えます(点、四角、多角形、円、Sphere) 球面空間でのクエリもサポートしています Geospatial Queries |
どちらも、緯度経度による空間データを扱えるので、近隣の施設などを検索することができます
グラフ表現
MySQL(MariaDB community edition) | MongoDB |
---|---|
OSS版のMariaDBだとデータベースエンジンレベルでの用意があるが AWSのAuroraではサポートしていないそう SQL Server Graph Features |
MongoDB as a Graph Databaseを確認すると、ノード(頂点)、エッジ(リレーション)、プロパティ、ラベルを基本としてグラフ型のオブジェクトとその検索をサポートしている graphLookupという、agrreegation piplineの機能を使うだけで簡単に利用できる 別途GraphQLなどのデータベースを用意しなくても利用できるようので使い勝手がいい |