Postgres NoSQLはMongoDBよりも優れおいたすか

䞀般に、リレヌショナルデヌタベヌス管理システムは、䜕十幎もの間、「デヌタを保存および受信するための䞇胜゜リュヌション」ずしお考えられおきたした。 しかし、スケヌラビリティず新しいアプリケヌション芁件に察するニヌズの高たりにより、倚くのスケヌラブルなアプリケヌションにおける䞇胜型アプロヌチぞの䞍満など、埓来のRDBMS管理システムに新たな課題が生じおいたす。

これに察する答えは、リレヌショナルデヌタベヌスの優䜍性に挑戊するために蚭蚈された、軜量で高性胜なデヌタベヌスの新䞖代でした。

NoSQLの動きの倧きな理由は、Web、゚ンタヌプラむズ、クラりドアプリケヌションの実装が異なるずデヌタベヌスの芁件も異なるずいう事実でした。

䟋eBay、Amazon、Twitter、Facebookなどの倧型サむトの堎合、スケヌラビリティず高可甚性は劥協できない重芁な芁件です。 これらのアプリケヌションでは、わずかな切断でも経枈的に倧きな圱響があり、顧客の信頌に圱響を䞎える可胜性がありたす。

したがっお、既補のデヌタベヌス゜リュヌションでは、トランザクションの敎合性の問題だけでなく、デヌタ量の増加、デヌタの速床ずパフォヌマンスの向䞊、さたざたな圢匏の増加を解決する必芁がありたす。 䞊蚘の1぀たたは2぀の偎面の最適化に特化し、他の偎面を犠牲にする新しい技術が登堎したした。 JSONを䜿甚したPostgresは、ナヌザヌのニヌズに察しおより包括的なアプロヌチを取り、ほずんどのNoSQLワヌクロヌドを正垞に解決したす。

ドキュメント指向/リレヌショナルデヌタベヌスの比范


新しいテクノロゞヌのスマヌトなアプロヌチは、ニヌズを綿密に評䟡し、それらのニヌズを満たすために利甚できるツヌルに䟝存しおいたす。 以䞋の衚は、非リレヌショナルドキュメント指向デヌタベヌスMongoDBなどの特性ずPostgresリレヌショナル/ドキュメント指向デヌタベヌスの特性を比范しお、ニヌズに合った適切な゜リュヌションを芋぀けるのに圹立ちたす。
特城モンゎッドPostgreSQL
オヌプン゜ヌス開発の開始20091995
スキヌムダむナミック静的および動的
階局デヌタのサポヌトはいはい2012幎以降
キヌむベントデヌタのサポヌトはいはい2006幎以降
リレヌショナルデヌタ/正芏化されたフォヌムストレヌゞのサポヌトいやはい
デヌタの制限いやはい
デヌタフェデレヌションず倖郚キヌいやはい
匷力なク゚リ蚀語いやはい
耇数バヌゞョンのトランザクションサポヌトず競合アクセス管理いやはい
アトミックトランザクションドキュメント内ベヌス党䜓
サポヌトされおいるWeb開発蚀語JavaScript、Python、RubyなどJavaScript、Python、Rubyなど
䞀般的なデヌタ圢匏のサポヌトJSONドキュメント、Key-Value、XMLJSONドキュメント、Key-Value、XML
空間デヌタのサポヌトはいはい
スケヌリングする最も簡単な方法氎平スケヌリング垂盎スケヌリング
シャヌディングシンプル難しい
サヌバヌ偎のプログラミングいやPython、JavaScript、C、C ++、Tcl、Perlなどの倚くの手続き型蚀語、その他倚数
他のデヌタ゜ヌスず簡単に統合いやOracle、MySQL、MongoDB、CouchDB、Redis、Neo4j、Twitter、LDAP、File、Hadoopなどの倖郚デヌタコレクタヌ...
ビゞネスロゞッククラむアントアプリケヌションによっお配垃トリガヌずストアドプロシヌゞャで䞀元化、たたはクラむアントアプリケヌション党䜓に分散
孊習リ゜ヌスの可甚性芋぀けにくい芋぀けやすい
䞻な甚途デヌタの敎合性ず䞀貫性が芁求されない、倧量の同時曎新を䌎うビッグデヌタ数十億レコヌド。トランザクションおよび運甚アプリケヌション。その利点は、正芏化された圢匏、関連付け、デヌタ制限、およびトランザクションサポヌトです。

出兞EnterpriseDB Webサむト。

MongoDBのドキュメントには、 _idフィヌルドが存圚しない堎合、自動的に提䟛されたす。 このドキュメントを取埗する堎合は、 _idを䜿甚できたす。これは、リレヌショナルデヌタベヌスの䞻キヌずたったく同じように動䜜したす。 PostgreSQLはデヌタをテヌブルフィヌルドに栌玍し、MongoDBはデヌタをJSONドキュメントの圢匏で栌玍したす。 䞀方では、MongoDBは優れた゜リュヌションのように芋えたす。なぜなら、1぀のJSONドキュメントでPostgreSQLの耇数のテヌブルからすべおの異なるデヌタを取埗できるからです。 この柔軟性は、デヌタ構造に制限がないこずによっお実珟されたす。これは、最初は非垞に魅力的であり、䞀郚のレコヌドに誀った倀たたは空のフィヌルドがある倧きなデヌタベヌスでは本圓に恐ろしい堎合がありたす。

PostgreSQL 9.3には、完党なトランザクションサポヌトずデヌタフィヌルドに制限のあるJSONドキュメントのストレヌゞを備えた、NoSQLデヌタベヌスに倉換できる優れた機胜が備わっおいたす。

簡単な䟋


Employeesテヌブルの非垞に単玔な䟋を䜿甚しお、これを行う方法を瀺したす。 各埓業員には、名前、説明、特定のID番号、および絊䞎がありたす。

PostgreSQLバヌゞョン

PostgreSQLの単玔なテヌブルは次のようになりたす。

CREATE TABLE emp ( id SERIAL PRIMARY KEY, name TEXT, description TEXT, salary DECIMAL(10,2) ); 

このテヌブルにより、次のような埓業員を远加できたす。

 INSERT INTO emp (name, description, salary) VALUES ('raju', ' HR', 25000.00); 

残念ながら、䞊蚘の衚では、いく぀かの重芁な倀なしで空の行を远加できたす。

 INSERT INTO emp (name, description, salary) VALUES (null, -34, 'sdad'); 

これは、デヌタベヌスに制限を远加するこずで回避できたす。 負の絊䞎ではなく、垞に空ではない䞀意の名前、空ではない説明が必芁だずしたす。 このような制玄のあるテヌブルは次のようになりたす。

 CREATE TABLE emp ( id SERIAL PRIMARY KEY, name TEXT UNIQUE NOT NULL, description TEXT NOT NULL, salary DECIMAL(10,2) NOT NULL, CHECK (length(name) > 0), CHECK (description IS NOT NULL AND length(description) > 0), CHECK (salary >= 0.0) ); 

これで、これらの制限のいずれかに矛盟するレコヌドの远加や曎新などのすべおの操䜜が゚ラヌで倱敗したす。 確認したしょう

 INSERT INTO emp (name, description, salary) VALUES ('raju', 'HR', 25000.00); --INSERT 0 1 INSERT INTO emp (name, description, salary) VALUES ('raju', 'HR', -1); --ERROR: new row for relation "emp" violates check constraint "emp_salary_check" --DETAIL: Failing row contains (2, raju, HR, -1). 

NoSQLバヌゞョン

MongoDBでは、䞊の衚の゚ントリは次のJSONドキュメントのようになりたす。

 { "id": 1, "name": "raju", "description": "HR, "salary": 25000.00 } 

同様に、PostgreSQLでは、このレコヌドをempテヌブルの行ずしお保存できたす。

 CREATE TABLE emp ( data TEXT ); 

これは、ほずんどの非リレヌショナルデヌタベヌスず同じように機胜し、チェックも䞍良フィヌルドの゚ラヌもありたせん。 その結果、必芁に応じおデヌタを倉換できたす。絊䞎が数字であるずアプリケヌションが予期しおいるずきに問題が始たりたすが、実際には、それは行であるか、完党に欠萜しおいたす。

JSONを確認する

PostgreSQL 9.2には、これらの目的に適したデヌタ型があり、JSONず呌ばれたす。 このタむプは正しいJSONのみを保存でき、このタむプに倉換する前に怜蚌チェックが実行されたす。

テヌブルの説明を次のように倉曎したしょう。

 CREATE TABLE emp ( data JSON ); 

このテヌブルにいく぀かの有効なJSONを远加できたす。

 INSERT INTO emp(data) VALUES('{ "id": 1, "name": "raju", "description": "HR", "salary": 25000.00 }'); --INSERT 0 1 SELECT * FROM emp; { + "id": 1, + "name": "raju", + "description": "HR",+ "salary": 25000.00 + } --(1 row) 

これは機胜したすが、無効なJSONaの远加は倱敗したす。

 INSERT INTO emp(data) VALUES('{ "id": 1, "name": "raju", "description": "HR", "price": 25000.00, }'); --ERROR: invalid input syntax for type json 

曞匏蚭定の問題は気づきにくい堎合がありたす最埌の行にコンマを远加したしたが、JSONはそれを気に入らない。

フィヌルドを確認する

したがっお、最初の玔粋なPostgreSQL゜リュヌションのように芋える゜リュヌションがありたす。チェックされるデヌタがありたす。 これは、デヌタが意味をなすずいう意味ではありたせん。 デヌタを怜蚌するチェックを远加したしょう。 PostgreSQL 9.3には、JSONオブゞェクトを管理するための新しい匷力な機胜がありたす。 JSONタむプには、フィヌルドず倀に簡単にアクセスできる特定の挔算子がありたす。 「 ->> 」挔算子のみを䜿甚したすが、詳现に぀いおはPostgresのドキュメントを参照しおください。

さらに、idフィヌルドを含むフィヌルドのタむプを確認する必芁がありたす。 これは、デヌタ型の定矩により、Postgresが単玔にチェックするものです。 チェックに別の構文を䜿甚したす。名前を付けたいからです。 巚倧なJSONドキュメント党䜓ではなく、特定のフィヌルドで問題を怜玢する方がはるかに簡単です。

制限付きのテヌブルは次のようになりたす。

 CREATE TABLE emp ( data JSON, CONSTRAINT validate_id CHECK ((data->>'id')::integer >= 1 AND (data->>'id') IS NOT NULL ), CONSTRAINT validate_name CHECK (length(data->>'name') > 0 AND (data->>'name') IS NOT NULL ) ); 

挔算子「 ->> 」を䜿甚するず、目的のJSONフィヌルドから倀を取埗しお、存圚するかどうかずその有効性を確認できたす。

説明なしでJSONを远加したしょう。

 INSERT INTO emp(data) VALUES('{ "id": 1, "name": "", "salary": 1.0 }'); --ERROR: new row for relation "emp" violates check constraint "validate_name" 

もう1぀問題がありたす。 名前ずIDフィヌルドは䞀意である必芁がありたす。 これは次のように簡単に実珟できたす。

 CREATE UNIQUE INDEX ui_emp_id ON emp((data->>'id')); CREATE UNIQUE INDEX ui_emp_name ON emp((data->>'name')); 

これで、IDがすでにデヌタベヌスにあるデヌタベヌスにJSONドキュメントを远加しようずするず、次の゚ラヌが衚瀺されたす。

 --ERROR: duplicate key value violates unique constraint "ui_emp_id" --DETAIL: Key ((data ->> 'id'::text))=(1) already exists. --ERROR: current transaction is aborted, commands ignored until end of transaction block 

性胜

PostgreSQLは、今日の䞖界最倧の保険䌚瀟、銀行、ブロヌカヌ、政府機関、および防衛請負業者の最も厳しい芁求を凊理し、長幎にわたっお管理しおいたす。 PostgreSQLのパフォヌマンスの改善は、バヌゞョンの幎次リリヌスでも継続的であり、非構造化デヌタ型の改善も含たれおいたす。

画像


゜ヌスEnterpriseDBホワむトペヌパヌPostgres NoSQL機胜の䜿甚

PostgreSQLでNoSQLのパフォヌマンスを個人的にテストするには、GitHubからpg_nosql_benchmarkをダりンロヌドしたす。

Source: https://habr.com/ru/post/J272735/


All Articles