データベース管理システムの種類とその違い

MongoDBとは
- ドキュメント指向ストレージ
- JSON(BSON)形式でデータを保存
- sqlではなくmongo用のクエリでDB操作
- 柔軟性とスケーラビリティが強みであり、業務要件が変化するアプリや、規模を拡大していくアプリに向いてる。
- データ一貫性やセキュリティの面ではMySQLなどのほうが適している。
主な機能
1. ドキュメント指向ストレージ
- JSONライクなドキュメント:データは柔軟なJSONライクなBSON形式で保存され、スキーマレスであるため、異なる構造のデータを同じコレクションに格納できます。
2. 柔軟なスキーマ設計
- 動的スキーマ:事前にスキーマを定義する必要がなく、アプリケーションの要件に応じてデータモデルを柔軟に変更可能です。
3. 高可用性とスケーラビリティ
- レプリカセット:自動フェイルオーバーとデータ冗長性を提供するために、データを複数のレプリカセットに複製します。
- シャーディング:大規模なデータセットを水平分割(シャーディング)して処理能力を向上させ、スケーラビリティを確保します。
4. 強力なクエリ機能
- リッチなクエリ言語:フィルタリング、ソート、集計、ジョインなどの複雑なクエリを実行できます。
- 全文検索:インデックスを使用して高速な全文検索が可能です。
5. インデックス作成
- 多様なインデックス:シングルフィールドインデックス、複合インデックス、地理空間インデックス、テキストインデックスなど、多様なインデックスをサポートします。
6. トランザクション
- マルチドキュメントACIDトランザクション:複数のドキュメントに対する原子的な操作をサポートし、データの整合性を保ちます。
7. アグリゲーションフレームワーク
- パイプラインベースのデータ処理:データを変換、フィルタリング、集計するための強力なツールを提供します。
8. モニタリングと管理ツール
- MongoDB Atlas:クラウドベースのマネージドデータベースサービスで、自動バックアップ、スケーリング、モニタリング機能を提供します。
- MongoDB Compass:GUIツールを使用してデータの視覚化や管理が容易に行えます。
9. セキュリティ
- 認証と認可:ロールベースのアクセス制御(RBAC)やLDAP、Kerberos認証をサポートし、データアクセスのセキュリティを強化します。
- 暗号化:データ暗号化とTLS/SSL接続をサポートし、データの安全性を確保します。
10. マルチプラットフォームサポート
- クロスプラットフォーム互換性:Linux、Windows、macOSなど、さまざまなオペレーティングシステム上で動作します。

レプリケーション
- DBにあるデータを別のDBに複製できる機能。
- 1つのDBに障害が発生してもすぐに復旧できる。
- mongoではマスタ(プライマリノード)でデータの読み書きを行い、スレーブ(セカンダリ)にマスタのデータ情報を反映させる。
- マスタが落ちると、スレーブのどれかがマスタの昇格する。
シャーディング
- DBのデータを複数のDBサーバに分散させて保存する機能。
- 読み書き処理を複数サーバに分散させることで負荷の軽減、性能の向上が期待できる。
MongoDBのシャーディングはレンジパーティション方式を採用しています。シャードキーを指定することで、各サーバに格納されるデータの範囲が決定されます。サーバ間で重複データは持たず、1つのデータが格納されるサーバはシャードキーの範囲によって1つに決定されます。

PostgresSQL
PostgreSQLは、カリフォルニア大学バークレー校の開発プロジェクトとして始まり、現在は世界中の開発者によって維持・開発されています。高度な機能を備え、エンタープライズ用途に適したデータベースとして評価されています。
- リレーショナルデータベース管理システム(RDBMS)
- SQLでデータベースを操作
- 日本語に対応している。
- 使いやすさ・簡単さ・速度・参考情報の多さなどを重視する場合はMySQL、大規模なデータベース構築や複雑なクエリの実行を要する場合は、PostgreSQLが適している。
主な機能
1. ACID準拠
- トランザクション:PostgreSQLはAtomicity(原子性)、Consistency(整合性)、Isolation(独立性)、Durability(永続性)を保証する完全なACIDトランザクションをサポートします。
2. 高度なSQLサポート
- 標準SQL:SQL標準に準拠しており、サブクエリ、結合、ウィンドウ関数、共通テーブル式(CTE)などの高度なクエリを実行できます。
- エクステンション:PostGISなどの拡張機能を使って機能を拡張できます。
3. データ型の豊富さ
- 多様なデータ型:整数、浮動小数点数、文字列、ブール値、日付/時刻、配列、JSON、XMLなど、多種多様なデータ型をサポートします。
- ユーザー定義型:ユーザー自身がカスタムデータ型を定義できます。
4. インデックス作成
- 多様なインデックス:B-tree、ハッシュ、GiST、SP-GiST、GIN、BRINなど、さまざまなインデックスをサポートし、クエリパフォーマンスを最適化します。
5. パーティショニング
- テーブルパーティショニング:大規模なテーブルをパーティションに分割し、クエリのパフォーマンスを向上させ、メンテナンスを容易にします。
6. フルテキスト検索
- フルテキスト検索:複雑な検索クエリを効率的に処理するためのフルテキスト検索機能を提供します。
7. リプリケーションと高可用性
- ストリーミングレプリケーション:マスタースレーブ方式の非同期レプリケーションをサポートし、高可用性を確保します。
- ロジカルレプリケーション:データの一部を特定のスキーマやテーブルに複製することができます。
8. アグリゲーションと分析機能
- ウィンドウ関数:ランク、パーセンタイル、移動平均など、分析クエリをサポートします。
- 集計関数:SUM、AVG、COUNT、MAX、MINなど、多様な集計関数を提供します。
9. 拡張性とカスタマイズ
- ストアドプロシージャとトリガー:PL/pgSQLや他の言語でストアドプロシージャを作成できます。
- カスタム関数:ユーザー定義の関数を追加できます。
10. セキュリティ
- ロールと権限管理:ロールベースのアクセス制御をサポートし、ユーザーやグループに対して細かな権限設定が可能です。
- SSL/TLS:データ通信を暗号化するためにSSL/TLSをサポートします。
11. マルチバージョン同時実行制御(MVCC)
- 非ロック読み取り:データベースの読み取り操作が書き込み操作をブロックしないようにし、並行処理性能を向上させます。
12. 国際化とローカリゼーション
- 多言語対応:Unicodeをサポートし、多言語のデータを効率的に処理できます。
- ロケール設定:データベースのソート順や文字列比較ルールをカスタマイズできます。

ACIDトランザクション
データの信頼性や整合性を保証するための仕組み
Atomicity(原子性)
データベーストランザクションは、データベースに対する一連の操作をまとめたものです。原子性とは、一連の操作がすべて実行されるか、一つも実行されないかのどちらかとなることを保証します。たとえば、銀行の送金トランザクションを考えた場合、資金の移動と双方の口座の更新がすべて成功するか、何も行われないかのどちらかです。
Consistency(一貫性)
一貫性は、データベーストランザクションの前後でデータベースが正当な状態の維持を保証する特性です。一貫性は、データベースの状態が常に一定のルールや制約を満たすことを保証します。
Isolation(独立性)
複数のユーザーやシステムがデータベースに同時アクセスする場合、それぞれのトランザクションは独立して動作する必要があります。独立性は、実行中のトランザクションが他のトランザクションの途中結果に影響されないことを保証します。
Durability(永続性)
トランザクションが一度完了したら、結果は恒久的にデータベースに保存されるべきです。永続性は、システム障害やクラッシュが発生した場合でも、完了したトランザクションの結果が保持され続けることを保証します。

MySQL
MySQLは、スウェーデンのMySQL AB社によって開発され、現在はOracle Corporationが所有しています。主にウェブアプリケーションやオンラインストアで広く使用されており、LAMP(Linux, Apache, MySQL, PHP/Perl/Python)スタックの一部として知られています。
- リレーショナルデータベース管理システム(RDBMS)
- SQLでデータベースを操作
- 日本語に対応している。
MySQLとPostgreSQLの違い
ライセンス
MySQL
MySQLは、GNU General Public License(GPL)に基づいて提供されており、商用ライセンスも利用可能です。これは、ソフトウェアを無料で使用、変更、配布できることを意味しますが、商用利用にはライセンス料が発生する場合があります。
PostgreSQL
PostgreSQLは、PostgreSQL Licenseという非常に寛容なオープンソースライセンスの下で提供されています。このライセンスは、MITライセンスに似ており、ソフトウェアの使用、コピー、変更、配布を自由に行うことができます。
パフォーマンス
MySQL
MySQLは読み取り操作に優れており、特にSELECT文のパフォーマンスが高いことで知られています。そのため、主に読み取り中心のアプリケーションに適しています。
PostgreSQL
PostgreSQLは書き込み操作に強く、複雑なクエリやトランザクション処理において高いパフォーマンスを発揮します。そのため、データの整合性が重要なシステムや高度なデータ分析を行うアプリケーションに向いています。
スケーラビリティ
MySQL
MySQLはスケーラビリティに優れ、リードレプリカ機能やシャーディングを用いて負荷分散を行うことができます。しかし、マスター-スレーブレプリケーションの設定が必要であり、スケールアウトには制限があります。
PostgreSQL
PostgreSQLはスケールアップが容易であり、特に垂直スケーリングに強いです。また、パーティショニングや高可用性のためのストリーミングレプリケーションなど、スケーラビリティを向上させるための多くの機能をサポートしています。
データ型と拡張性
MySQL
MySQLは基本的なデータ型をサポートしており、シンプルなスキーマ設計に適しています。拡張性には制限があり、カスタムデータ型の作成は難しいです。
PostgreSQL
PostgreSQLは非常に豊富なデータ型をサポートしており、ユーザー定義型(UDT)や配列、ハッシュ、JSONなどの複雑なデータ型も扱えます。また、ストアドプロシージャやカスタム関数の作成も容易です。
SQL標準の準拠
MySQL
MySQLはSQL標準の一部に準拠していますが、独自の拡張も含まれています。そのため、移植性に制限がある場合があります。
PostgreSQL
PostgreSQLはSQL標準に非常に高いレベルで準拠しており、他のデータベースからの移行や相互運用性が高いです。標準に忠実な実装が特徴です。
トランザクションとロック機構
MySQL
MySQLは、InnoDBストレージエンジンを使用することでACID特性をサポートしています。行レベルのロックを使用し、高いパフォーマンスとデータの整合性を維持します。
PostgreSQL
PostgreSQLは、MVCC(Multiversion Concurrency Control)を採用しており、トランザクション処理が非常に強力です。行レベルのロックや、ネイティブのトランザクション管理機能により、高い同時実行性を提供します。
コミュニティとサポート
MySQL
MySQLのコミュニティは非常に大きく、多くのリソースやプラグインが提供されています。商用サポートも充実しており、Oracleによる企業サポートが受けられます。
PostgreSQL
PostgreSQLのコミュニティも非常に活発で、多くのオープンソースプロジェクトや拡張機能が存在します。エンタープライズ向けの商用サポートも複数の企業から提供されています。
使用例
MySQLの使用例
- ウェブアプリケーション(例:WordPress)
- オンラインストア(例:Magento)
- データウェアハウス
PostgreSQLの使用例
- エンタープライズアプリケーション(例:Salesforce)
- 地理情報システム(例:PostGIS)
- データ分析プラットフォーム
まとめ
MySQLとPostgreSQLはそれぞれ異なる強みを持っており、用途に応じて使い分けることが重要です。MySQLはシンプルで高パフォーマンスな読み取り操作が求められるアプリケーションに向いており、PostgreSQLは高度なデータ整合性や複雑なクエリが必要なシステムに適しています。どちらのデータベースも強力なコミュニティと豊富なリソースを持っており、ニーズに応じた選択が可能です。

まとめ
特徴 | MySQL | PostgreSQL | MongoDB |
---|---|---|---|
データベースタイプ | リレーショナル | リレーショナル | NoSQL(ドキュメント指向) |
主要な利用シナリオ | ウェブアプリケーション、Eコマース、データウェアハウス | 大規模データ分析、複雑なクエリ、GIS | ビッグデータ、リアルタイムアプリケーション、モバイルアプリケーション |
トランザクション | はい | はい | はい (ACIDトランザクションをv4.0以降でサポート) |
ライセンス | GPL(商用ライセンスもあり) | PostgreSQL License | SSPL |
プログラミング言語サポート | PHP, Python, Java, C#, Rubyなど | Python, Java, C#, JavaScript, Rubyなど | JavaScript, Python, Javaなど |
レプリケーション | マスター-スレーブ、マスター-マスター | マスター-スレーブ、同期レプリケーション | レプリカセット(自動フェールオーバー機能付き) |
インデックスサポート | B-Tree, Fulltextなど | B-Tree, GIN, GiST, BRINなど | B-Tree, Geospatial, Textなど |
スケーラビリティ | 垂直スケーリングが主 | 垂直スケーリングが主、一部の機能で水平スケーリングも可能 | 高い水平スケーラビリティ |
補足情報
- MySQLは、クエリのパフォーマンスとインデックス最適化に優れており、関係データベース管理システム(RDBMS)として広く使用されています。また、リプリケーションにはマスター-マスターおよびマスター-スレーブの両方式をサポートしています
- PostgreSQLは、大規模なデータ分析や複雑なクエリの処理に適しており、同期レプリケーションと非同期レプリケーションの両方を提供しています。これにより、データの一貫性を高めることができます
- MongoDBは、そのスキーマレスのデータモデルとドキュメント指向のアプローチにより、大量の非構造化データを効率的に扱うことができます。レプリケーションはレプリカセットを通じて行われ、高い可用性とスケーラビリティを実現します