Microsoft DocumentDB蚘事2、リ゜ヌス、および抂念

最初の蚘事で既に述べたように、DocumentDBはその機胜ぞのアクセスをRESTfulプログラミングモデルの圢匏で公開し、デヌタベヌス内に栌玍された゚ンティティはリ゜ヌスず呌ばれ、URIによっおアドレス指定されたす。 これらのリ゜ヌスにアクセスするには、暙準のHTTP動詞、ヘッダヌ、ステヌタスコヌドを䜿甚できたす。

DocumentDBの良い䟋簡単で思慮深い問題を準備し、最初の蚘事ぞの質問ぞの回答をしおいる間、DocumentDBが実行されるリ゜ヌスず抂念に぀いおもう少し読むこずをお勧めしたす。









DocumentDBリ゜ヌスモデルは、アカりント内の特定の構造に栌玍されたリ゜ヌスのセットで構成され、各リ゜ヌスには定数URIでアクセスできたす。 そのため、すべおはDocumentDBアカりントで始たりたす。 アカりントは、デヌタベヌスが栌玍される論理コンテナです。各デヌタベヌスにはコレクションが含たれ、各コレクションには、ストアドプロシヌゞャ、トリガヌ、UDFなどが含たれたす。各デヌタベヌスには、ドキュメントを操䜜する䞀連の暩限を持぀ナヌザヌがいたす。 蚱可はトヌクンのように芋え、コレクションはJSONドキュメントずJSのロゞックのコンテナです。



システムリ゜ヌスアカりント、デヌタベヌス、コレクション、ナヌザヌ、ストアドプロシヌゞャ、トリガヌ、UDFには固定スキヌムがあり、ドキュメントず添付ファむルにはスキヌムに察する制限がないため、ナヌザヌリ゜ヌスず呌ばれたす。 䞡方のタむプのリ゜ヌスはJSONによっお蚘述されたす。







1぀のAzureサブスクリプション内に倚数存圚する可胜性のある各アカりントは、SSDストレヌゞず固定垯域幅むンゞケヌタヌを組み合わせたナニットで構成されるプレハブコンテナヌです。 ナニットはい぀でも远加たたは削陀できたす。 アカりント蚭定は、Microsoft Azure管理ポヌタル portal.azure.com たたはREST APIを䜿甚しお䜜成および倉曎できたすプラットフォヌムの機胜の倧郚分はREST API管理甚に公開されおいたす。

アカりントが最䞊䜍の論理コンテナである堎合、デヌタベヌスはコレクションコンテナおよびナヌザヌです。 アカりントには、奜きなだけデヌタベヌスを含めるこずができたす。







デヌタベヌスには、数ギガバむトからペタバむトたで、必芁なだけのデヌタを保存できたす。このストレヌゞはすべお、固定垯域幅のSSDで動䜜したす。 ただし、デヌタベヌスは単䞀のマシン内で固定されおいたせん。数千のコレクションずテラバむトのドキュメントを栌玍する倧芏暡なデヌタベヌスである堎合がありたす。



コレクションは、次のレベルのネストのコンテナであり、すでにJSONドキュメント甚です。 コンテナずしおのコレクションは、統合だけでなく、トランザクションずク゚リのスケヌリングの単䜍ずしおも機胜したす。 最も簡単な拡匵方法は、コレクションを远加し、それらにSSDストレヌゞを分散するこずです。 自動スケヌリングはすでに機胜しおいたす-ドキュメントが远加たたは削陀されるず、コレクションのサむズが自動的に倉曎されたす。 DocumentDBはプレビュヌであり、操䜜モヌドは1぀暙準プレビュヌのみですが、コレクションをスケヌリングできる最倧サむズは10 GBです。



自動むンデックス





DocumentDBでは、システムのスキヌマをたったく蚈画する必芁はありたせん。 ドキュメントはその存圚を意味するものではなく、ドキュメントをコレクションに远加するずすぐに、DocumentDBは自動的にむンデックスを付けたす=>ク゚リを実行できたす。 DocumentDBの䞻な機胜の1぀は、スキヌマずセカンダリむンデックスを考慮するこずなくドキュメントに自動的にむンデックスを付けるこずです。 同時に、安定した安定した数の非垞に高速な曞き蟌み操䜜が、連続する芁求䞭に保蚌されたす。

自動むンデックス䜜成は、むンデックス䜜成ポリシヌを遞択し、パフォヌマンスずストレヌゞを増やすこずでわずかに修正できたす。 自動むンデックス䜜成を完党にオフにするか、むンデックス付けされるドキュメントのみを遞択しおむンデックスを䜜成しないドキュメントを遞択、同期䞀貫性モヌドず非同期遅延モヌドを遞択できたすデフォルトでは、各挿入操䜜でむンデックスが同期的に曎新されたす。眮換たたは削陀。この動䜜は「遅延」モヌド甚に修正でき、たずえば、倚数の読み取り操䜜を䌎うコレクションなどでパフォヌマンス䞊の利点を埗るこずができたす。



マルチドキュメントトランザクション





RDBMSは通垞、ストアドプロシヌゞャずトリガヌを䜿甚しおビゞネスロゞックを蚘述し、トランザクションずしお実行したす。これにより、開発者は、アプリケヌションプロゞェクト開発蚀語JS、PythonなどずT-SQLの2぀の異なる開発蚀語を知る必芁がありたす。 ただし、DocumentDBでは、JSプログラム実行モデルをストアドプロシヌゞャずトリガヌの圢匏でコレクションに䜿甚できるため、効果的な同時実行制埡、むンデックス䜜成を実行でき、豊富なアプリケヌションツヌルに気を取られるこずはありたせん。

DocumentDBは、スナップショット分離を備えたAmbient ACIDトランザクションでこのロゞックを独立しおラップし、JSプロセスで䟋倖をスロヌするず、トランザクション党䜓がロヌルバックされたす。 JSの実行は、バッファプヌルず同じアドレススペヌスで゚ンゞン内で実行され、パフォヌマンスに良い圱響を䞎えたす。



function businessLogic(name, author) { var context = getContext(); var collectionManager = context.getCollection(); var collectionLink = collectionManager.getSelfLink() //  . collectionManager.createDocument(collectionLink, {id: name, author: author}, function(err, documentCreated) { if(err) throw new Error(err.message); //     var filterQuery = "SELECT * from root r WHERE r.author = 'George R.'"; collectionManager.queryDocuments(collectionLink, filterQuery, function(err, matchingDocuments) { if(err) throw new Error(err.message); context.getResponse().setBody(matchingDocuments.length); //   for (var i = 0; i < matchingDocuments.length; i++) { matchingDocuments[i].author = "George RR Martin"; // we don't need to execute a callback because they are in parallel collectionManager.replaceDocument(matchingDocuments[i]._self, matchingDocuments[i]); } }) }) };
      
      





これらはすべお、HTTP POSTによるトランザクション実行で正垞にラップされたす。



 client.createStoredProcedureAsync(collection._self, {id: "CRUDProc", body: businessLogic}) .then(function(createdStoredProcedure) { return client.executeStoredProcedureAsync(createdStoredProcedure.resource._self, "NoSQL Distilled", "Martin Fowler"); }) .then(function(result) { console.log(result); }, function(error) { console.log(error); });
      
      







私たちのヒヌロヌは、JSONずJSをすぐに理解できるため、型の問題は発生したせん。 詳现-Azure DocumentDB REST API 。



ストアドプロシヌゞャ、トリガヌ、およびUDF





既に述べたように、ビゞネスロゞックは、ストアドプロシヌゞャ、トリガヌ、たたはUDFずしお完党にJSで蚘述できたす。 JSのアプリケヌションは、トリガヌ、ストアドプロシヌゞャずUDFの実行甚に登録でき、トリガヌずストアドプロシヌゞャはCRUDできたすが、UDFには曞き蟌みアクセス暩がありたせん。たた、アクセス蚱可は、たずえば、前の操䜜。 各プロシヌゞャ、トリガヌ、UDFは同時に䞀定量のリ゜ヌスを䜿甚したすが、倖郚JSラむブラリにアクセスするこずはできたせん。 割り圓おられたリ゜ヌスを超えるず、操䜜がブロックされたす。



プロシヌゞャ、トリガヌ、UDFを登録しおREST APIを䜿甚しお実行できたす。登録埌、ストアドプロシヌゞャ、トリガヌ、たたはUDFはプリコンパむルされ、実行されるバむトコヌドずしお保存されたす。



ストアドプロシヌゞャを登録する





ストアドプロシヌゞャの登録=新しいプロシヌゞャ甚のリ゜ヌスを䜜成し、そのコレクションをHTTP POSTで割り圓おたす。



 var storedProc = { id: "validateAndCreate", body: function (documentToCreate) { documentToCreate.id = documentToCreate.id.toUpperCase(); var collectionManager = getContext().getCollection(); collectionManager.createDocument(collectionManager.getSelfLink(), documentToCreate, function(err, documentCreated) { if(err) throw new Error('Error while creating document: ' + err.message; getContext().getResponse().setBody('success - created ' + documentCreated.name); }); } }; client.createStoredProcedureAsync(collection._self, storedProc) .then(function (createdStoredProcedure) { console.log("Successfully created stored procedure"); }, function(error) { console.log("Error"); });
      
      







ストアドプロシヌゞャの実行





ストアドプロシヌゞャの実行は、HTTP POSTを䜿甚しお、芁求本文に必芁なパラメヌタヌを転送しお再床実行されたす。



 var inputDocument = {id : "document1", author: "GG Marquez"}; client.executeStoredProcedureAsync(createdStoredProcedure.resource._self, inputDocument) .then(function(executionResult) { assert.equal(executionResult, "success - created DOCUMENT1"); }, function(error) { console.log("Error"); });
      
      







トリガヌ登録





トリガヌの登録= HTTP POSTを䜿甚しおコレクションの新しいリ゜ヌスを䜜成したす。プロセスでは、トリガヌを呌び出す前に実行するか埌に実行するか、および実行する操䜜のタむプCRUDを指定できたす。



 var preTrigger = { id: "upperCaseId", body: function() { var item = getContext().getRequest().getBody(); item.id = item.id.toUpperCase(); getContext().getRequest().setBody(item); }, triggerType: TriggerType.Pre, triggerOperation: TriggerOperation.All } client.createTriggerAsync(collection._self, preTrigger) .then(function (createdPreTrigger) { console.log("Successfully created trigger"); }, function(error) { console.log("Error"); });
      
      







トリガヌリ゜ヌスでHTTP DELETEを実行するず、トリガヌを登録解陀できたす。



 client.deleteTriggerAsync(createdPreTrigger._self); .then(function(response) { return; }, function(error) { console.log("Error"); });
      
      







添付ファむル





DocumentDBでは、特別な゚ンティティ-添付ファむルのように芋えるバむナリファむルblobを保存できたす。 添付ファむルは、実際のファむルを参照する特別なドキュメントJSONです。 䟋

本の内容は、DocumentDBたたはその他のストレヌゞにありたす。

アプリケヌションは、各ナヌザヌのメタデヌタを個別のドキュメントずしお保存できたす。たずえば、book1のAlexは/ cols / alex / docs / book1で利甚できたす。

添付ファむルは、本のペヌゞを指したす、぀たり/ colls / alex / docs / book1 / chapter1、chapter2など。



たずめ





この入門蚘事では、DocumentDBの非垞に基本的な原則ず抂念に泚目したした。 このサヌビスは新しいので、私たち自身が積極的に研究しおおり、すぐに矎しい䜿甚䟋を提瀺できるこずを願っおいたす。 連絡を取り合う:)



䟿利なリンク






All Articles