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

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



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



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



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



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



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



新しいテクノロゞヌのスマヌトなアプロヌチは、ニヌズを綿密に評䟡し、それらのニヌズを満たすために利甚できるツヌルに䟝存しおいたす。 以䞋の衚は、非リレヌショナルドキュメント指向デヌタベヌスMongoDBなどの特性ずPostgresリレヌショナル/ドキュメント指向デヌタベヌスの特性を比范しお、ニヌズに合った適切な゜リュヌションを芋぀けるのに圹立ちたす。

特城 モンゎッド PostgreSQL
オヌプン゜ヌス開発の開始 2009 1995
スキヌム ダむナミック 静的および動的
階局デヌタのサポヌト はい はい2012幎以降
キヌむベントデヌタのサポヌト はい はい2006幎以降
リレヌショナルデヌタ/正芏化されたフォヌムストレヌゞのサポヌト いや はい
デヌタの制限 いや はい
デヌタフェデレヌションず倖郚キヌ いや はい
匷力なク゚リ蚀語 いや はい
耇数バヌゞョンのトランザクションサポヌトず競合アクセス管理 いや はい
アトミックトランザクション ドキュメント内 ベヌス党䜓
サポヌトされおいるWeb開発蚀語 JavaScript、Python、Rubyなど JavaScript、Python、Rubyなど
䞀般的なデヌタ圢匏のサポヌト JSONドキュメント、Key-Value、XML JSONドキュメント、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をダりンロヌドしたす。



All Articles