PostgreSQL対MongoDB:データベースの比較

PostgreSQL対MongoDB:データベースの比較

  • オーケストレーション
6分で読めます 更新日 Jul 16, 2020

ポイント: PostgreSQLはスキーマを必要とする従来のRDBMSであり、MongoDBは柔軟なスキーマなしのJSONデータベースです。どちらも無料版を提供しており、MongoDBは追加のクラウドモニタリングを提供しています。

  • PostgreSQLはデータ入力のために事前定義されたスキーマを必要とします。
  • MongoDBは厳密なスキーマ制約なしで動的データ入力をサポートしています。

この記事では、MongoDBとPostgreSQLを比較します。

PostgreSQLは、OracleやMySQLのような従来のRDBMS(リレーショナルデータベース管理システム)であり、無料です。

MongoDBは、スキーマのないnoSQL、JSONデータベースです。MongoDBには無料版がありますが、ホスティングされた有料版とエンタープライズ版もあります。無料版でも、ローカルインストール用のクラウドモニタリングが無料で提供されています。

PostgreSQL

ここでは、PostgreSQLの基本を説明します。

従来のRDBMS

PostgreSQLのような従来のRDBMS(リレーショナルデータベース管理システム)は、スクリプトスキーマを持ち、主キーを必要とします。データ列がすでに存在しない限り、データを追加することはできません。

PostgreSQLシェル

PostgreSQLシェルは、OracleやMySQLとは少し異なります。ログインする方法は次のとおりです:

データを追加

MongoDB

    sudo su - postgres
postgres@paris2:~$ psql
psql (9.5.21)
Type "help" for help.

postgres=#

次に、スラッシュ(\)を使用して、SQLコマンドではないコマンドを実行します。

テーブルを作成

PostgreSQLでテーブルとスキーマを作成する方法は次のとおりです:

    create table expenses (
TransactionDate date,
PostDate date,
Description text,
Category text,
Type text,
Amount float8
);

データベースに接続

    \c expenses
You are now connected to database "expenses" as user "postgres".

テーブルのリスト

    \dt
                  List of relations
 Schema |          Name           | Type  |  Owner   
--------+-------------------------+-------+----------
 public | chase                   | table | postgres

クエリを実行

以下のクエリは集約を行います。

クエリ

    select  category, sum(amount) from chase group by category;
       category        |  sum  
-----------------------+-------
                       | 19389
 Education             |  -216
 Health & Wellness     | -3154
 Personal              | -1582
 Automotive            |   -33
 Shopping              | -4479
 Travel                | -7026
 Fees & Adjustments    |  -316
 Entertainment         |  -274
 Gas                   |  -139
 Home                  | -1409
 Food & Drink          | -1926
 Bills & Utilities     | -3114
 Professional Services |  -114
 Groceries             | -1720
(15 rows)

データを追加

    INSERT INTO expenses( 
transactiondate , postdate,  description,   category , type ,amount ) VALUES ('10-July-2020', '10-July-2020', 'coffee shop', 'restaurants', 4.50);

ここでは、MongoDBの基本を説明します。

JSONデータベース

PostgreSQLや他のRDBMSとは異なり、MongoDBのようなJSONデータベースにはスキーマがないため、何でも入れることができます。SQLデータベースでは、データを入力する前にその構造を定義する必要があります。

JSONは次のようになります:

    data: {
    attribute:  value
}

また、JSONの配列は次のようになります:

    data: [{
    attribute1:  value1
},
{
    attribute1:  value2,
   anotherAttribute:  value3
}]

MongoDBシェル

MongoDBシェルを開くには、単にmongoと入力します:

    mongo
MongoDB shell version v3.6.17
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("fd8960a6-d6fd-44f7-a6c5-5257438934e3") }

データベースを作成

    use sales
switched to db sales

コレクションを作成

コレクションは、関連するテーブルのセットです。

    db.createCollection("inventory")
{ "ok" : 1 }

レコードを追加

    db.inventory.insert({product: "blue shoes", add: 2})
WriteResult({ "nInserted" : 1 })

クエリ

    db.inventory.find({product: "blue shoes"})
{ "_id" : ObjectId("5f0808a6434f5a1831100614"), "product" : "blue shoes", "add" : 2 }

MongoDBシェルでのJavaScriptの使用

MongoDBシェルの非常に強力な機能の1つは、JavaScriptをサポートしていることです。つまり、関数を定義し、クエリを変数として保存できます。

例えば、地図上に四角形を描くことでコネチカットを定義する方法は次のとおりです。この文は、MongoDBのGeoJSON地理クエリ機能を使用しています。

    var connecticut = db.address.find ({location:
     {$geoWithin:
       {$geometry: {
       type: "Polygon",
       coordinates:
 [[ [ -73.564453125, 41.178653972331674 ],
   [ -71.69128417968749, 41.178653972331674 ],
   [ -71.69128417968749, 42.114523952464246 ],
   [ -73.564453125, 42.114523952464246 ],
   [ -73.564453125, 41.178653972331674 ]
   ]]
}}}});

テーブルの結合

1970年代、IBMがSQL言語とその後Larry EllisonがOracleに発展させたデータベースを説明した論文を発表したとき、ディスクスペースとメモリは高価でした。したがって、採用された慣行は、データを繰り返さないことでした。これは、高価なスペースとメモリを無駄にしないからです。この慣行はデータベースの正規化と呼ばれています。

もちろん、今日ではストレージとメモリは安価です。noSQLデータベース設計者は正規化を行いません。これにより、外部キーやテーブル間の関係を作成する他の設計要素が不要になり、物事が簡素化されます。しかし、独自の問題も生じます。(例えば、SQLデータベースは依然として会計のようなトランザクションシステムに適しているため、参照整合性を維持するのが容易です—ただし、それはまったく別のトピックです。)

データが2つのテーブルに保持されており、レポートを作成するために一時的にそれを1つにまとめたい場合、結合と呼ばれる操作を実行します。これにより、2つのセットの交差点が作成されます。

このように機能します:

    select sales.productName, product.productName from sales, product where product = upcCode;

欠点は、これが大規模な分散データベースで実行するのに多くの計算能力、メモリ、およびストレージを必要とすることです。

MongoDBはインデックスを持っていますが、結合はありません

MongoDBは結合を奨励しないか、実際に許可しません。代わりに、関連するドキュメント(レコード)を互いに入れ子にして、すべてを1つの場所に配置します。これは、販売システムのような何かには少し扱いにくいです。

    { product : "shoes", 
    sales: [{saleNumber:  1, date: 44004, amount: 20, quantity 2},
               {saleNumber:  2, date: 44005, amount: 200, quantity 20}]
}

これはトランザクションシステムで維持するのが扱いにくいですが、他のタイプのシステムには適しているでしょう。

それでも、MongoDBは結合をサポートしていませんが、インデックスを許可します。これは結合の必要な機能です。これにより、クエリが高速化されます。

追加リソース

これが2つのデータベースの並列比較です。このトピックについて詳しく学ぶには、BMCビッグデータ&機械学習ブログや次のリソースを参照してください:

MongoDBガイド

  1. MongoDBの概要:MongoDBの始め方
  2. UbuntuおよびMacにMongoDBをインストールする方法
  3. MongoDBでのデータベースの作成
  4. MongoDBシェルの基本コマンド
  5. MongoDB Compass:Mongo GUIの使用
  6. MongoDBのロールベースのアクセス制御(RBAC)について
  7. MongoDBのプロジェクションとプロジェクションオペレーターについて
  8. MongoDBの集約関数について
  9. MongoDBのソート:sort()メソッドと例
  10. MongoDBでのプッシュとプルオペレーターの使用
  11. MongoDBの$unwindの使用方法
  12. 23の一般的なMongoDBクエリオペレーターとその使用方法
  13. MongoDBのGeoLocationクエリの例
  14. MongoDBトランザクションの紹介
  15. MongoDBインデックス:主要なインデックスの種類とその管理方法
  16. 知っておくべき主要なMongoDBコマンド
  17. MongoDBレプリケーション:完全な紹介
  18. MongoDBクラスターのセットアップ方法
  19. MongoDBシャーディング:概念、例、チュートリアル
  20. MongoDB Atlas:管理されたMongoDBの設定と使用
  21. MongoDBをDockerコンテナとして実行する方法
  22. MongoDBのメモリ使用量、管理、および要件
  23. MongoDBバックアップのためのmongodumpの使用方法
  24. MongoDBバックアップを復元するためのmongorestoreの例
  25. PyMongoの使用方法
  26. MongoDBとNodeJSのためのMongooseの使用方法
  27. MongoDBチートシート
  28. MongoDB対Cassandra:NoSQLデータベースの比較
  29. PostgreSQL対MongoDB:データベースの比較
  30. MySQL対MongoDB:データベースの比較
  31. MongoDB認定:紹介

これらの投稿は私のものであり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。

オーケストレーションの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。