ポイント: 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ガイド
- MongoDBの概要:MongoDBの始め方
- UbuntuおよびMacにMongoDBをインストールする方法
- MongoDBでのデータベースの作成
- MongoDBシェルの基本コマンド
- MongoDB Compass:Mongo GUIの使用
- MongoDBのロールベースのアクセス制御(RBAC)について
- MongoDBのプロジェクションとプロジェクションオペレーターについて
- MongoDBの集約関数について
- MongoDBのソート:sort()メソッドと例
- MongoDBでのプッシュとプルオペレーターの使用
- MongoDBの$unwindの使用方法
- 23の一般的なMongoDBクエリオペレーターとその使用方法
- MongoDBのGeoLocationクエリの例
- MongoDBトランザクションの紹介
- MongoDBインデックス:主要なインデックスの種類とその管理方法
- 知っておくべき主要なMongoDBコマンド
- MongoDBレプリケーション:完全な紹介
- MongoDBクラスターのセットアップ方法
- MongoDBシャーディング:概念、例、チュートリアル
- MongoDB Atlas:管理されたMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBのメモリ使用量、管理、および要件
- MongoDBバックアップのためのmongodumpの使用方法
- MongoDBバックアップを復元するためのmongorestoreの例
- PyMongoの使用方法
- MongoDBとNodeJSのためのMongooseの使用方法
- MongoDBチートシート
- MongoDB対Cassandra:NoSQLデータベースの比較
- PostgreSQL対MongoDB:データベースの比較
- MySQL対MongoDB:データベースの比較
- MongoDB認定:紹介
これらの投稿は私のものであり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。