MongoDB と PostgreSQL はどのように異なりますか?

MongoDB と PostgreSQL は 2 つの異なるタイプのデータベースです。MongoDB は、柔軟なデータモデルを備えた非リレーショナルデータベースまたは NoSQL データベースです。あらゆる種類のデータを JSON ドキュメントとして保存できるため、検索、複製、分析を迅速に行うことができます。これとは対照的に、PostgreSQL はオブジェクトリレーショナルデータベース管理システムであり、これを使用してデータを行と列を含むテーブルとして保存できます。構造化データのデータ型、スケーラビリティ、同時実行性、およびデータ整合性に柔軟性を提供します。

MongoDB について読む »

PostgreSQL について読む »

データモデルの違い: MongoDB 対PostgreSQL

MongoDB と PostgreSQL は、異なるデータモデルを持つ異なるタイプのデータベースです。

MongoDB

MongoDB は、データを JSON ドキュメントにキーと値のペアとして格納するドキュメントデータベースです。各ドキュメントには、配列、ブール値、数値、文字列、ネストされたドキュメントなど、さまざまなタイプのデータを格納できます。MongoDB はバイナリ JSON (BSON) を使用することで、追加のデータ型を保持し、データを効率的に処理します。MongoDB のデータストレージの柔軟性により、非構造化データ、進化するデータ、動的データを保存できます。

MongoDB は各ドキュメントをコレクションに整理し、各コレクションには一意の ObjectId があり、これを使用してドキュメントを識別します。次の表は、MongoDB の顧客データの例を示しています。

お客様:[

{

  customer_id:「1」、

  名前:「John Doe」、

  国:「米国」

},

{

  customer_id:「2」、

  年齢:「35」

  email: "jane_doe@example.com"

}]

PostgreSQL

これとは対照的に、PostgreSQL はオブジェクト指向機能とリレーショナルデータベース機能を組み合わせたオブジェクトリレーショナルデータベース管理システム (ORDBMS) です。テーブルでは、すべての行が個々のデータポイントを表し、各列がそこに保存する情報の種類を定義します。PostgreSQL は、日付、テキスト、整数、ブール値など、さまざまなデータ型をサポートしています。 

MongoDB とは異なり、PostgreSQL は事前定義されたスキーマを使用してデータを保存します。各列には特定のデータ型が格納されるため、スキーマを使用すると、データ整合性と一貫性が強化されます。ただし、柔軟性は低くなります。以下の表に例を示します。

dbo.customers

customer_id

名前

年齢

Eメール

1

John Doe

24

john_doe@example.com

2

Jane Doe

35

jane_doe@example.com

アーキテクチャの違い: MongoDB 対PostgreSQL

MongoDB と PostgreSQL には、アーキテクチャ上の相違点がいくつかあります。

ストレージの基本単位

MongoDB では、ストレージの基本単位はシリアル化された JSON ドキュメントです。ドキュメントは、キーと値のペアを含む JSON データ構造です。これらのペアでは、キーは文字列で、値はデータのタイプです。MongoDB は、ネストされたドキュメント、配列、文字列、日付、ブール値、数値など、さまざまなデータ型をサポートしています。

NoSQL データベースとは異なり、PostgreSQL の基本的なストレージユニットはタプルと呼ばれる行です。各タプルは、列が定義する特定のデータ型の下に単一のレコードを保持します。タプルには、整数、文字列、日付、ブール値などを格納できます。各タプルには、データ値に加えて、テーブル内の各タプルを識別するプライマリキーなどのメタデータも含まれています。

クエリー言語

MongoDB は MongoDB クエリ言語 (MQL) を使用しています。これにより、MongoDB のドキュメント指向の構造を操作することができます。MQL は機能が豊富で、プロジェクション、アグリゲーションフレームワーク、ドキュメントクエリ、アグリゲーションパイプライン、地理空間クエリ、テキスト検索をサポートしています。 

PostgreSQL は、クエリ言語として Postgres SQL と呼ばれる SQL バリアントを使用しています。SQL に似ていますが、拡張可能な型システム、関数、継承などの追加機能があります。ただし、PostgreSQL は引き続き標準 SQL と互換性があるため、SQL クエリも使用できます。

インデックス作成

インデックスは、1 つ以上の列の値をディスク上の対応するデータの物理的な位置にマップするデータ構造です。これにより、データベースデータ検索操作の効率が向上します。

MongoDB はインデックスを使用してクエリのパフォーマンスを最適化します。フィールドレベルとコレクションレベルの両方でのインデックス作成をサポートしています。B ツリーインデックス、複合インデックス、テキストインデックス、地理空間インデックス、ハッシュインデックス、クラスターインデックスなど、いくつかのインデックスタイプが用意されています。

PostgreSQL は、B ツリー、ハッシュ、GIN、GiST、SP-GiST など、さまざまなインデックスタイプも提供しています。create index コマンドは、デフォルトで B ツリーインデックスを作成します。 

同時実行

同時実行とは、データベースシステムが複数のトランザクションを同時に管理できることです。同時実行により、複数のユーザーが、不整合の問題や競合を引き起こすことなく、データにアクセスして変更することができます。

MongoDB には、ドキュメントレベルのアトミック性と楽観的ロックを使用する通貨制御メカニズムがあります。これは、ほとんどの同時実行書き込み操作に競合がないことを前提としています。これにより、ユーザーはロックを取得せずに同時にデータを変更できます。すべての変更はアトミックです。つまり、操作が完全に適用されるか、まったく適用されないかのどちらかです。また、ドキュメントの新しいリビジョン ID が作成されます。これにより、同じデータを持つ複数のドキュメントを同時に存在させることができます。 

また、PostgreSQL はマルチバージョン同時実行制御 (MVCC) を使用してデータと同時トランザクションを管理します。MVCC は、ユーザーがデータを変更すると別々の行を作成するため、トランザクション間で競合が発生することはありません。未コミット読み取り、コミット済み読み取り、シリアル化可能、繰り返し可能な読み取りという分離レベルをサポートしています。PostgreSQL では、変更をディスクに書き込む前にデータベースへの変更を記録するログ先行書き込み (WAL) も使用しています。 

可用性

可用性により、サーバーが停止しているときでもデータのダウンタイムが発生しません。MongoDB は、データをレプリカセットに複製するプライマリノードレプリケーションを使用します。1 つのプライマリノードが書き込みを受信し、セカンダリノードがこのデータを複製します。MongoDB は、プライマリノードが使用できなくなった場合に、新しいプライマリノードを選択するフェイルオーバーを自動的にトリガーします。これらのプロセスは MongoDB のダウンタイムを最小限に抑えます。

これとは対照的に、PostgreSQL は論理レプリケーションとストリームレプリケーションを使用して高可用性を確保しています。論理レプリケーションは、特定のテーブルまたはデータのサブセットを選択的に複製します。ストリーミングレプリケーションは、プライマリデータベースの変更を受け取るスタンバイレプリカを作成します。さらに、PostgreSQL は PostgreSQL 自動フェイルオーバー (PAF) を使用して、障害イベントが発生した場合に新しいプライマリを割り当てます。 

スケーラビリティ

PostgreSQL と MongoDB はどちらも、ある種の負荷分散を使用して、高度なスケーラビリティを実現しながら、読み取り操作を複数のレプリカに均等に分散します。分散アーキテクチャのプロセスはデータを移動してパフォーマンスを向上させます。データは PostgreSQL のレプリカ間と MongoDB のパーティション間で移動します。 

また、MongoDB はシャーディングと読み取りのスケーラビリティを使用して、高いレベルの水平スケーラビリティを確保しています。シャーディングはデータを複数のパーティションに分散し、各シャードはデータのサブセットを保持します。シャーディングは、トラフィックの多いデータセットのワークロードを複数のサーバーに分散します。セカンダリレプリカは読み取り操作を処理できるため、読み取りのワークロードが分散され、パフォーマンスが向上します。 

PostgreSQL はパーティショニングも提供しています。パーティショニングでは、大きなテーブルを小さく管理しやすい部分に分割します。ハッシュ、範囲、リスト、またはその他の基準に基づいて分割できます。 

主な相違点: MongoDB 対PostgreSQL

MongoDB と PostgreSQL の主要なアーキテクチャとパフォーマンスの違い以外にも、他にも重要な違いがあります。

ACID 準拠

PostgreSQL は、トランザクションがアトミックで、一貫性があり、独立し、耐久性 (ACID) であることを保証します。これにより、高いレベルのデータ整合性が促進されます。PostgreSQL はリレーショナルデータベース管理システムであるため、トランザクションが ACID の各プロパティに従うことを保証できます。

MongoDB では、バージョン 4.0 から ACID 準拠のトランザクションが導入されました。ただし、ACID 準拠は PostgreSQL の中核部分ですが、これを使用できるのはいくつかの限られたシナリオだけです。

データリレーションシップ

PostgreSQL では、外部キーを使用してテーブル間の関係を定義できます。このシステムを使用すると、複雑な結合を実行したり、テーブル間の関係を形成したりできます。この関数は、定義したリレーションシップを使用してデータセットを接続し、複数のテーブルにまたがるデータをクエリする場合に特に便利です。

MongoDB は、コレクション間の事前定義された関係を使用しない NoSQL データベースです。MongoDB は、関連データをドキュメントに埋め込む非正規化を使用します。非正規化は、クエリに必要なすべてのデータがそのドキュメント内に存在するため、読み取り操作を最適化するのに役立ちます。このシステムにより、データを結合する必要性が最小限に抑えられます。

コミュニティサポート

PostgreSQL のコミュニティは、1996 年の開始以来、成長を続けています。強力なオープンソースコミュニティがあり、多くの PostgreSQL サポートライブラリ、ツール、拡張機能、および一般的なサポートが利用可能です。

MongoDB はコミュニティの成熟度では同レベルではありませんが、多くのプログラミング言語用のドライバーを提供しています。好みのプログラミング言語を使って MongoDB を操作するのに役立つコミュニティや支援ツールがたくさんあります。

使用するタイミング: MongoDB 対PostgreSQL

MongoDB と PostgreSQL のどちらを選択するかは、主にデータによって決まります。

MongoDB のユースケース

MongoDB は、柔軟なデータモデル、高パフォーマンス、効果的な水平スケーリングを備えた NoSQL データベースです。以下の例は MongoDB のユースケースです。

コンテンツ管理システム

MongoDB は、画像、動画、テキストなどの非構造化データを保存および取得できます。コンテンツを迅速にクエリおよび取得でき、多数の同時読み取りおよび書き込み操作を処理できます。そのため、トラフィックの多いコンテンツ管理アプリケーションに適しています。

トランザクションデータベース

MongoDB は水平方向のスケーラビリティと可用性が高いため、金融システムにおけるトランザクションデータの処理に最適です。 

ストリーム分析

MongoDB は、高いスケーラビリティ、水平パーティショニング、柔軟なスキーマを備えているため、モノのインターネット (IoT) プラットフォームやリアルタイム分析などのストリーミングデータアプリケーションに役立ちます。

PostgreSQL のユースケース

PostgreSQL の構造化された機能豊富なシステムは、以下の例のようなユースケースをサポートするのに役立ちます。

データウェアハウジング

PostgreSQL は、複雑な結合を処理し、関係の概要を説明し、データを迅速にクエリできます。構造化されているため、大量のデータを処理し、洞察と高度な分析を迅速に提供できます。これらの機能により、ビジネスインテリジェンスツールにうまく統合でき、データウェアハウスとしても効果的に機能します。

e コマースアプリケーションとウェブアプリケーション

PostgreSQL は SQL データベースと似ているため、ACID に準拠しています。トランザクションの処理とデータ整合性の確保に高い信頼性を発揮します。PostgreSQL の複雑なクエリとインデックス作成により、注文の処理、ユーザーの認証、在庫管理を必要とする企業にとって高いパフォーマンスを発揮します。

フレキシブルな接続

PostgreSQL のフェデレーション型データハブにより、非リレーショナルデータベースとリレーショナルデータベースの両方を含むさまざまなデータストアに接続できます。PostgreSQL は JSON サポートと外部データラッパーを使用して、他のデータベースシステムへの接続とアクセスを行います。これらの機能により、多言語のデータベース環境と連携できるため、ストレージを最適化したい複雑な業界に適しています。

相違点の要約: MongoDB とPostgreSQL

 

MongoDB

PostgreSQL

データモデリング

MongoDB は、データをコレクション内の JSON のようなドキュメントとして処理します。 

PostgreSQL は、テーブル、行、列を使用してデータを格納するオブジェクトリレーショナルデータベース管理システムです。

ストレージの基本単位

シリアル化された JSON ドキュメント。

タプルと呼ばれる行。

インデックス作成

MongoDB はフィールドレベルとコレクションレベルでインデックスを作成し、B ツリーインデックス、複合インデックス、テキストインデックス、地理空間インデックス、ハッシュインデックス、クラスターインデックスを使用します。

PostgreSQL は B ツリー、ハッシュ、GIN、GiST、および SP GiST インデックスタイプをサポートしています。

クエリー言語

MongoDB は MongoDB クエリ言語 (MQL) を使用します。

PostgreSQL は、標準 SQL クエリと互換性のある SQL バリアントを使用します。

同時実行

MongoDB は、通貨制御メカニズム、ドキュメントレベルのアトミック性、楽観的ロック、MVCC を使用して同時実行を提供します。

PostgreSQL は、MVCC、データスナップショット、柔軟な分離レベル、デッドロック検出を使用して同時実行を提供します。

可用性

MongoDB は、プライマリノードレプリケーションとセカンダリノードを使用して可用性を提供します。トランザクションワークフローを処理できます。

PostgreSQL は、論理レプリケーションとストリームレプリケーションに加えて PAF を使用して可用性を提供します。大量のデータを同時に処理できます。 

スケーラビリティ

MongoDB は、シャーディング、読み取りスケーラビリティ、および自動データバランシングを使用して、水平スケーラビリティを提供します。

PostgreSQL は、負荷分散、接続プーリングツール、およびパーティショニングを使用してスケーラビリティを提供します。

AWS はお客様の MongoDB と PostgreSQL の要件をどのようにサポートできますか?

PostgreSQL 用 Amazon Relational Database Service (Amazon RDS) は、クラウド内で PostgreSQL のデプロイを簡単にセットアップ、運用、およびスケーリングできるようにします。また、PostgreSQL ソフトウェアのアップグレード、ストレージ管理、ディザスタリカバリのためのバックアップなど、複雑で時間のかかる管理タスクも処理します。

Amazon DocumentDB (MongoDB 互換) を使用すると、クラウドでネイティブ JSON ドキュメントデータベースを簡単に管理できます。これにより、何百万件ものドキュメントの読み取り/書き込みリクエストに対応できます。生産性が向上し、高可用性や低レイテンシなどのエンタープライズ機能が提供されます。

今すぐアカウントを作成して、Amazon Web Services (AWS) で MongoDB と PostgreSQL の使用を開始しましょう。