エンタープライズ向けNoSQL

EDB Relational QT

Postgres NoSQL for the Enterpriseとは?

Postgres NoSQLは、非構造化データベース技術とリレーショナルデータベース技術を単一のエンタープライズデータベース管理システム内に統合した強力な製品です。Postgres NoSQLを使用すると、非構造化データや半構造化データを自由かつ柔 軟に処理できるパフォーマンスを提供できるほか、企業情報としてのそれらの データの長期的な実用性を確保できます。

PostgresのドキュメントおよびKey-Valueストア(KVS)テクノロジーは、新しいNoSQL技術に多くの利点を提供するほか、データサイロ、運用の複雑さ、データの整合性の損失やリスクなしに、NoSQL技術を従来型の企業データインフラストラクチャに統合する機能を提供します。

 

完全なドキュメントデータベース

Postgresは、業界トップのJSONの実装を、その実績のあるACIDトランザクションエンジンと組み合わせています。このユニークな組み合わせにより、コスト効率が良く、業界に認められたプラットフォーム上で、業界最高のワークロードの柔軟性をユーザーに提供できます。

今日、完全なデータベースソリューションは、多くの場合、トランザクションの整合性を実現するだけでなく、より高次のデータ量、データ増加速度とスループット速度の増大、およびデータフォーマットの種類の増大にも対処する必要があります。これらの側面の1つか2つの最適化に特化した新しいテクノロジーはすでに出現しています。ただし、そのようなテクノロジーは、それ以外の側面を犠牲にしています。

JSONとPostgresは、ユーザーのニーズに対してより総合的なアプローチを取ることにより、他の多くのNoSQLのワークロードをより適切に処理します。詳細に関しては、ホワイトペーパーPostgreSQL Advances to Meet NoSQL Challengesを参照してください。

 

ACIDか、それともBASEか

ACID(Atomicity、Consistency、Isolation、Durability)とはデータベーステクノロジーを数十年にわたって主導している標準であり、組織が持つ最も価値あるリソース(すわなちその組織が持つデータ)を保護し、その有効性と一貫性を保つことを目的としています。 スタンドアロンのNoSQLテクノロジーは、クリティカルなデータ保護を犠牲にすることで、非構造化アプリケーションの高スループット性能を実現しようとするため、ACIDの標準を満たしていません。ただし、スタンドアロンのNoSQLテクノロジーは、BASE(Basic Availability, Soft State and Eventual Consistency)標準を満たしているため、失われたテキストメッセージやマルチプレイヤーゲームでのトークンの移動のような、リスクのほとんどないユースケースで適用される場合があります。

NoSQLソリューションは単一ドキュメント内での原子性を確保できますが、これは、非集計化データ(構造化データまたは非構造化データのどちらであれ)の複数のセット間にミッションクリティカルな関係があるほとんどのエンタープライズシステムにとっては十分ではありません。PostgresのNoSQL機能を使用すると、非構造化データの重要な部分を、従来通り管理されてきたデータと統合することで、パフォーマンスを維持することが容易になります。また、NoSQLの各種ツールを使用することで、アジャイルな非構造化データ処理を実現できるようになります。

 

シンプル性

ソーシャルウェブまたはモバイルウェブ用のアプリの作成は、PostgresがサポートしているJavascript、Python、Ruby、node.js、JSON、Key-Valueストア(KVS)、地理空間、XMLなどの機能を使うことで簡単に行えます。

開発者は、自分が好むアジャイル型のツールを使用して、顧客エクスペリエンスの改善、タイムトゥマーケット(TTM)の短縮、コスト削減を実現できます。

 

スケーラビリティ

Postgresのユーザーの爆発的な増加は、大量のデータを処理する数千人のユーザーを擁する高スループットのシステムをサポートするという実績により促進されてきた部分もあります。最大規模の環境を含むあらゆる状況において、Postgresは、多数の同時接続ユーザーのために大量のデータを容易に処理できます。 

  • EDBが提供するxDB Replication Serverは、仮想化されていない読み取りのスケールアウトを実現するソリューションを提供します。マルチマスター構成のxDBは、アメリカ最大の電話会社の1つに、読み取りスケーラビリティと書き込みの可用性を提供しています。 
  • Failover Managerは、フォールトトレラントなデータベースクラスタを作成することにより、マスターデータベースの障害時にダウンタイムを最小化し、100%に限りなく近い高可用性を必要とする環境においてデータをオンライン状態に保ちます。 
  • 大規模なPostgres構成およびソリューションは、EDBのPostgres Enterprise Managerを使用することで、専門的な管理、監視、チューニングを行うことができます。Postgres Enterprise Managerには、パフォーマンスダッシュボード、クリティカルな状態に関する警告、キャパシティプランニング、ログアナライザなどの機能が含まれています。

 

パフォーマンス

今日、Postgresは、世界最大の保険会社、銀行、証券会社、政府機関、防衛納入業者などが抱える最も要求の厳しいニーズに応えており、数年にわたりその状態を維持しています。Postgresのパフォーマンスは、毎年提供される各リリースにおいて向上し続けており、しかも、これには非構造化データタイプに関するパフォーマンスの改善も含まれています。

 

EDBは、PostgresのNoSQLが提供するパフォーマンスを、お客様自身で体験することをお勧めします。GitHubからpg_nosql_benchmarkをダウンロードして実行した後、そのベンチマーク結果に関するご感想を弊社までお知らせください。

ドキュメント/リレーショナルデータベースの比較

新しいテクノロジーに対するスマートなアプローチは、お客様のニーズと、それらのニーズを満たすために利用可能なツールに関する綿密な評価を必要とします。下記の表では、NoSQLのドキュメント指向のデータベース(MongoDBなど)の特性と、Postgresのリレーショナル/ドキュメントデータベース特性を比較しています。この表は、お客様が各自の要件に合ったソリューションを見つける際に役立ちます。

機能 MongoDB PostgreSQL
オープンソース開発の開始時期 2009年 1995年
スキーマ 動的 静的および動的
階層的なドキュメントデータのサポート あり あり(2012年より)
Key-Valueデータのサポート あり あり(2006年より)
リレーショナルデータ/正規化されたフォームストレージのサポート なし あり
データ制限 なし あり
最大ドキュメントサイズ 16 MB 1,000 MB
データ結合 非常に難しい 簡単
強力な標準クエリー言語 なし あり
トランザクションのサポートとマルチバージョン同時実行制御 なし あり
アトミックトランザクション 1つのドキュメント内 データベース全体
サポートしているウェブ開発言語 JavaScript、Python、Rubyなど多数 JavaScript、Python、Rubyなど多数
一般的なウェブデータフォーマットのサポート JSON(ドキュメント)、Key-Value、XML JSON(ドキュメント)、Key-Value、XML
地理空間のサポート あり あり
スケーリングへの簡単なパスを提供 水平的なスケールアウト 垂直的なスケールアップ
シャーディング 簡単 複雑
サーバーサイドプログラミング なし Python、JavaScript、C、C++、Tcl、Perlなど、その他多くの手続き型言語をサポート
他のデータソースとの統合が容易 いいえ、データサイロを作り出す はい、Foreign Data Wrappers(FDW)で Oracle, MySQL, MongoDB, CouchDB, Redis, Neo4j, Twitter, LDAP, File, Hadoop などと統合が可能
ビジネスロジック 埋め込みまたは、クライアントアプリケーションに分散されている トリガーおよびストアドプロシージャを使用して中央で一元管理されるか、またはクライアントアプリケーション間で分散されている
熟練リソースの利用可能性 見つけにくい 見つけやすい
主な用途 高度な同時アップデートを伴うビッグデータ(数10億件のレコード)処理(データの整合性や一貫性は必要とされない) 正規化されたフォーム、結合、データ制約、トランザクションサポートにより恩恵を受ける、トランザクションアプリケーションおよび運用アプリケーション

 

PostgresのでJSON機能の詳細については...

Postgresによる構造化データおよび非構造化データのサポート

ドキュメントストアやKey-Valueストア(KVS)などのNoSQLテクノロジーは、インクリメンタルな開発方法論をサポートします。この方法論では、データモデルは、ERダイアグラム、正規フォーム分析、概念的/論理的/物理的設計フレームワークなどを使用して慎重に事前作成されるのではなく、アプリケーションがアジャイルな開発サイクルを通過した時点で出現します。

NoSQLとACIDを共に使用

Postgresは、JSON(2012年)およびHSTORE(2006年)を導入することにより、Postgresの堅牢なACID(原子性、一貫性、独立性、永続性)モデルと完全に統合されたスキーマレスなデータ管理オプションを提供しています。

 

JSONデータタイプのサポート

Postgresは、検証パーサ、ストレージ、およびJSON文書内の要素を抽出するための広範な種類の機能を完備した、JSONデータを挿入するための堅牢なサポートを提供しています。

 

JSON InとJSON Out

また、Postgresは、クエリー結果の集合をJSONに簡単にコード化する機能も提供します。これはJSONをネイティブに使用して作業することを好むアプリケーション開発者が、各自のデータをPostgresからオリジナルのフォーマットで簡単に単位取得できることを意味します。

 

ドキュメントとKey-Valueデータ

Postgresは、Key-Valueをサポートするために2006年からHSTOREを提供しています。ただし、その他のNoSQLのみのソリューションとは異なり、Postgres内で作成されたKey-Valueストア(KVS)はACID準拠になります。JSONと同様に、HSTOREは、必要な場合に、スキーマレスのデータベースをエミュレートするために使用されます。Postgresにより維持されるKey-Valueデータを、JSON形式のデータに変換する関数も提供されています。これにより、Postgresが取り扱うことのできるNoSQLライクなアプリケーションの柔軟性とスコープを改善できます。

 

JSONとJavascript

Postgresは、データベース内で Javascript機能を提供しているため、ウェブ開発者は、自分のウェブクライアントを動作させているJavaScriptエンジンと同じものを使用して、中央で一元管理されるデータベースロジックを作成できます。V8はGoogleによりChrome向けのに開発されたものであり、クライアントおよびサーバー上で動作するように設計されています。また、V8はNode.jsの中心部に位置しています。V8は、Postgresのアドオン機能であるPL/V8として提供されます。Postgresでは、開発者は、各自のウェブデータフォーマットとウェブアプリケーション言語をデータベース内でも使用できます。

 

精度が必要となる場合のPostgres

Postgres 9.4では、バイナリストレージフォーマットを持つ第2のJSONタイプであるJSONBが追加されています。このフォーマットは、より大規模なドキュメントのみのデータベースプロバイダーの1つにより使用されているBSONとは大きく異なります。BSONとは”Binary JSON”の略です。ただし、実際には、すべてのJSON値をBSONを使用して表せるわけではありません。例えば、BSONは、64ビットを超える制度の整数や浮動小数点数を表すことができません。一方、JSONBは、任意のJSON値を表すことができます。

PostgresのでJSON機能の詳細については...

PostgresのJSON/JSONB演算子と関数

Postgresのリレーショナル環境でJSONデータの格納、取り出し、変換、操作、作成を行うために使用できる様々な演算子と関数を、次の表に示します。これらの機能をPostgresのKey-Valueフォーマット(HSTORE)、全文検索、トライグラム検索、再近傍検索、 GINおよびGiSTインデクシング、UNLOGGEDテーブル、XMLサポート、Foreign Data Wrapper( MongoDB、CouchDB、Redisなど)、および「最終的な一貫性」を実現する非同期コミット設定などと組み合わせて使用する場合、非同期データのニーズを満たすために他の特化されたデータベースは必要ないことが分かるでしょう。

PostgresのJSONデータタイプは、JSON(JavaScript Object Notation)データを、RFC 7159の規定に従って格納するために使用されます。JSONデータタイプは、入力テキストの完全なコピーを格納します。この処理関数は、実行ごとに再パーシングを行う必要があります。一方、JSONBデータは、分解されたバイナリフォーマットで格納されるため、変換のオーバーヘッドが追加される結果として、入力は少々遅くなります。ただし、再パーシングは必要ないため、処理は大幅に速くなります。また、JSONBはインデクシングをサポートしています。これは非常に大きなメリットとなります。

 

2つのJSONデータタイプであるJSONとJSONBを使用する場合に利用できる演算子を次の表に示します。

JSONおよび JSONB演算子
演算子 適切なオペランドのタイプ 説明
–> int JSON配列の要素を取得します (インデックスはゼロから始まり、負の整数は末尾からカウントされます)。
–> text キー別にJSONオブジェクトフィールドを取得
–>> int JSON配列要素をテキストとして取得
–>> text JSONオブジェクトフィールドをテキストとして取得
#> text[ ] 指定されたパスにあるJSONオブジェクトを取得
#> text[ ] 指定されたパスにあるJSONオブジェクトをテキストとして取得

 

その他の演算子は、JSONB(JSONのバイナリストレージフォーマット)の場合にのみ存在します。

その他の JSONB演算子
演算子 適切なオペランドのタイプ 説明
@> jsonb 左側のJSON値のトップレベルに、右側のJSONパス/値のエントリが含まれているかどうかを判定します。
<@ jsonb 右側のJSON値の内部のトップレベルに、左側のJSONパス/値のエントリが含まれているかどうかを判定します。
? text 文字列が、JSON値内部にトップレベルキーとして存在しているかどうかを判定します。
?| text[ ] これらの 文字列のいずれかがトップレベルキーとして存在しているかどうかを判定します。
?& text[ ] これらのすべての文字列がトップレベルキーとして存在しているかどうかを判定します。
| | jsonb 2つのjsonb値を連結して新しいjsonb値を生成します。
- text キー/値のペアまたは文字列要素を左オペランドから削除します。キー/値のペアは、それぞれのキー値に基づいてマッチングされます。
- integer 指定のインデックスに含まれている配列要素を削除します (負の整数は末尾からカウントされます)。トップレベルコンテナが配列でない場合、エラーをスローします。
#- text[] 指定のパスに含まれているフィールドまたは要素を削除します (JSON配列の場合、負の整数は末尾からカウントされます)。

 

次の表には、JSON値を作成する場合に使用できる関数を示します。現在、JSONBには同等の関数はありませんが、これらの関数のいずれかの結果をJSONへとキャスト(型変換)することは可能です。

JSONの作成関数
関数 説明
to_json(anyelement)

to_jsonb(anyelement)

値をjsonまたはjsonbとして戻します。配列および複合体は、配列およびオブジェクトへと(再帰的に)変換されます。 JSONへの型変換(キャスト)が存在する場合、キャスト関数を使用して変換が実行されます。それ以外の場合、スカラー値が生成されます。数、ブール値、またはヌル値以外の任意のスカラー型の場合、それが有効なJSONまたはJSONB値となるような形式で、テキスト表現が使用されます。
array_to_json(anyarray [, pretty_bool]) 配列をJSON配列として戻します。PostgreSQLの多次元配列は、複数の配列から構成される JSON配列となります。pretty_boolがtrueである場合、dimension-1用の間に改行が追加されます。
row_to_json(record [, pretty_bool]) 行をJSONオブジェクトとして戻します。pretty_boolがtrueである場合、level-1要素の間に改行が追加されます。
json_build_array(VARIADIC "any")

jsonb_build_array(VARIADIC "any")

可変個引数リストから、不均一に型指定された可能性のあるJSON配列を作成します。
json_build_object(VARIADIC "any")

jsonb_build_object(VARIADIC "any")

可変個引数リストからJSONオブジェクトを作成します。通常、引数リストは、交互に並ぶキーと値から構成されます。
json_object(text[ ])

jsonb_object(text[ ])

テキスト配列からJSONオブジェクトを作成します。この配列は、偶数のメンバー(交互に並んだキー/値のペアとして解釈される)を含む完全な1次元配列であるか、または各内部配列が完全な2つの要素(キー/値のペアとして解釈される)を持つ2次元配列でなければなりません。
json_object(keys text[ ], values text[ ])

jsonb_object(keys text[ ], values text[ ])

この形式のjson_object takesは、2つの独立した配列からキーと値のペアを取得します。それ以外のすべての面では、これは1変数形式と同じになります。

 

次の表には、JSON値とJSONBを処理する場合に使用できる関数を示します。

JSON処理関数
関数 戻り値の型 説明
json_array_length(json)

jsonb_array_length(jsonb)

int 最も外側のJSON配列の要素数を戻します。
json_each(json)

jsonb_each(jsonb)

setof key text, value json

setof key text, value jsonb

最も外側のJSONオブジェクトをkey/valueペアの集合へと展開します。
json_each_text(json)

jsonb_each_text(jsonb)

setof key text,

value text

最も外側のJSONオブジェクトをkey/valueペアの集合へと展開します。 戻り値はテキストタイプになります。
json_extract_path(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path(from_jsonb jsonb, VARIADIC path_elems text[ ])

json

jsonb

path_elemsによりポイントされるJSON値を戻します(#>演算子に同じ)。
json_extract_path_text(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[ ])

test path_elemsによりポイントされるJSON値をテキストとして戻します(#>>演算子に同じ)。
json_object_keys(json)

jsonb_object_keys(jsonb)

setof text 最も外側のJSONオブジェクト内にあるキーの集合を戻します。
json_populate_record(base anyelement, from_json json)

jsonb_populate_record(base anyelement, from_json jsonb)

anyelement from_json内のオブジェクトを、対応する列がベース(下記の註を参照)により定義されたレコードタイプと一致する行へと展開します。
json_populate_recordset(base anyelement, from_json json)

jsonb_populate_recordset(base anyelement, from_json jsonb)

setof anyelement from_json内のオブジェクトの最も外側の配列を、対応する列がベース(下記の註を参照)により定義されているレコードタイプと一致する行の集合へと展開します。
json_array_elements(json)

jsonb_array_elements(jsonb)

setof json

setof jsonb

JSON配列を、JSON値の集合へと展開します。
json_array_elements_text(json)

jsonb_array_elements_text(jsonb)

setof text JSON配列を、テキスト値の集合へと展開します。
json_typeof(json)

jsonb_typeof(jsonb)

text 最も外側のJSON値の型をテキスト文字列として戻します。可能な型は、object、array、string、number、boolean、 nullです。
json_to_record(json)

jsonb_to_record(jsonb)

record JSONオブジェクトから任意のレコードを作成します(下記の注を参照)。レコードを戻すすべての関数を使用する場合、呼び出し側は、AS句を使用して当該レコードの構造を明示的に定義する必要があります。
json_to_recordset(json)

jsonb_to_recordset(jsonb)

setof record JSONオブジェクトの配列から任意のレコードの集合を作成します(下記の注を参照)。レコードを戻すすべての関数を使用する場合、呼び出し側は、AS句を使用して当該レコードの構造を明示的に定義する必要があります。
json_strip_nulls(from_json json)

jsonb_strip_nulls(from_json jsonb)

json

jsonb

省略されたヌル値を持つすべてのオブジェクトフィールドに含まれていいるfrom_jsonを戻します。それ以外のヌル値は変更されません。
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) jsonb new_valueにより置き換えられたパスによる指定されたセクションに含まれているターゲット、またはcreate_missingが真であり(デフォルトは真)かつパスにより指定された項目が存在しない場合、追加されたnew_valuesに含まれているターゲットを戻します。パス指向の演算子を使用する場合、パスに指定された負の整数は、JSON配列の末尾からカウントされます。
jsonb_pretty(from_json jsonb) text インデントされたJSONテキストとしてfrom_jsonを戻します。

 

完全なJSON関数および演算子のリファレンスと使用例についてはこちらをクリックしてください。

 

PostgresのでJSON機能の詳細については...

皆様のご意見をお寄せください

弊社のWebサイトについて、皆様のご意見をお寄せください。このWebサイトが皆様のニーズを満たすよう改善していきます。

回答する >>

PG XDKチュートリアル

PostgreSQL XDKを使用すると、PostgreSQLのNoSQL機能を調べることができます。 

Amazon Web Services上での無料チュートリアルを通じて、PostgreSQL 9.4を使用してJSONデータを操作する方法を学習できます。

PG XDKクイックスタートガイド

PosgreSQLをダウンロード

 

NoSQL Webcast

Greater Developer Flexibility with NoSQL in EDB Postgres

NoSQL will give developers control over the data to be stored within the database without having to rely on a DBA to implement changes. This presentation will give an overview of what NoSQL is, briefly what the pros and cons are, and includes a demo of the NoSQL functionality in EDB Postgres to allow you to better choose the best data management solution for your use case.
 

NoSQLのベンチマーク

Postgresによる非構造化データ処理の性能と、MongoDBの性能の比較を自分自身で確認する

Postgres NoSQL Benchmarkをダウンロードして、自社独自のテストを実施する

PosgreSQLをダウンロード