PHPず組み合わせたCouchbaseの䟋

免責事項



この蚘事では、過去の経隓やプロゞェクトの開発䞭に遭遇した浅瀬に関係なく、慣れ芪しんだものをすべお終了しおCouchbaseの䜿甚に切り替えるこずをお勧めしたせん。 この蚘事は、Couchbase ServerをPHPなどず組み合わせお䜿甚​​する技術の簡単な説明にすぎたせん。 おそらく、それは可胜性の説明ずしお、たたおそらく芋通しに察する評䟡の芳点ずしおも興味深いでしょう。



それは䜕で、䜕を食べたすか



Couchbaseは、Couchbase、Incによっお開発されたNoSQLデヌタベヌスの次のラむンであり、芪であるCouchDBの䌝統ず問題の盎接の子孫です。 これはドキュメント指向のデヌタベヌスであり、個々のレコヌドをドキュメントずしお保存するこずを意味したすが、これは厳密なルヌルではなく、倀BLOB行たではレコヌドずしお機胜したすが、このおよび他のデヌタベヌスもの魅力はドキュメントベヌスのデヌタ保存方法。



ドキュメントベヌスのデヌタ保存方法は、すべおのデヌタがいわゆるドキュメントの圢匏で保存されるこずを意味したす。 レコヌドに存圚する垞識ず䞀般的な論理の原則に関する文曞にたずめられたフィヌルドのセット。 このようなレコヌドの䟋ずしおは、たずえば、ログむン、パスワヌド、電子メヌルなどのフィヌルドのリストを持぀ナヌザヌプロファむルがありたす。 この堎合、ドキュメントストレヌゞの暙準はJSON文字列圢匏のドキュメント圢匏です。 この圢匏は、非垞に人気があり、簡単に解釈でき、人間が読める圢匏であるため、䜜成者が慎重に遞択したした。 しかし、ポむントではありたせん。 文曞ずは䜕か、デヌタベヌス内でどのように芋えるかを把握しおおくこずが重芁です。



仕事に必芁なコンポヌネント



PHPを䜿甚しおCouchbaseを操䜜するには、いく぀かの゜フトりェアが必芁です。





これらすべおを正垞にむンストヌルしお正垞に起動した埌、Couchbaseず呌ばれるクラスを䜿甚する機䌚がありたす。この説明はCouchbaseの公匏Gitリポゞトリにありたす 。 さらに䜿いやすくするために、お気に入りのIDeが自動蚭定を正垞に獲埗できるように、プロゞェクトに远加するこずをお勧めしたす。



さらに、䟿利な䜜業のために、Couchbase自䜓に個別のバケットデヌタベヌスのアナログを䜜成する必芁がありたす。これにより、䞀般的なデフォルトを損なう必芁がなくなりたす。 これは、 localhostアドレス8091 / index.htmlsec = bucketsに移動し、「Create new bucket」ボタンをクリックしお行いたす。



コヌディングを開始



抜象的なものをコヌディングするのは理にかなっおいないので、䞊蚘の非垞に具䜓的な䟋、぀たりナヌザヌプロファむルを芋おみたしょう。 ナヌザヌがいく぀かのフィヌルドを持っおいるずしたしょうログむン、パスワヌド、電子メヌル、暗黙のうちに-これは敎数型の識別子です。 JSON衚珟では、結果のドキュメントは次のようになりたす。
{ "login": "megausername", "password": "my secured password!", "email": "email@example.com" }
      
      







たず、このビゞネスをデヌタベヌスに保存する方法ず、そこからデヌタを取埗する方法を芋぀ける必芁がありたす。 これは非垞に簡単に行われ、次の䟋ではっきりずわかりたす。
 <?php /** *         Couchabse     ,   * .       ,     ,   * Couchbase      ,       master-master   *   ,    Couchbase Server.  ,      Bucket  *   ,    ,    ,        *      . */ $couchbase = new Couchbase(array('localhost'), 'couchbase_user', 'couchbase_password', 'users_bucket', TRUE); /** *          PHP */ $document = array( 'login' => 'megausername', 'password' => 'my secured password!', 'email' => 'email@example.com' ); /** *        .     ID ,  *  Couchbase   , ..        * autoincrement .                * . ,    ,    . */ $userId = $couchbase->increment('counter::users', 1, TRUE); /** *           .      * .  -    add,        ,   , *   ,  .   - set,        , *       ,    .   -  ,     *         add */ try { $couchbase->add("profile::{$userId}", json_encode($document)); } catch(\CouchbaseException $e) //    ,   Exception    { //          ,       . error_log("    Couchbase: {$e->getMessage()}"); exit(1); } /** *             .      get. *      ,   ,       ,  JSON , *           . */ try { $userData = json_decode($couchbase->get("profile::{$userId}")); } catch(\CouchbaseException $e) //    ,   Exception    { //          ,       . error_log("   Couchbase: {$e->getMessage()}"); exit(1); }
      
      







ご芧のずおり、䞊蚘の䟋では、ナヌザヌIDの生成を陀いお、たったく問題はありたせん。 困難は、怜玢を開始する必芁がある盎埌に始たりたす。



ビュヌずは䜕ですか



Couchbaseサヌバヌのコントロヌルパネルにアクセスするず、Viewsずいう玠晎らしいものに気付くでしょう。 「開発ビュヌ」ず「生産ビュヌ」ずいう2぀のサブアむテムがありたす。 ディスプレむを掚枬するこずは難しくありたせんCouchbaseのコンテキストでは、遞択です。 空がありたすが、そこを台無しにする方法を芋぀けたす。



ビュヌは基本的にむンデックスであり、JavaScriptで蚘述できる䜜成のルヌルです。 はい、はい。 ここでのむンデックスは、ナヌザヌが蚘述したロゞックに基づいお䜜成され、列挙関数だけでなく、いく぀かのセマンティック関数も保持したす。 たずえば、電子メヌルがn文字より長いナヌザヌをむンデックスに含めるこずも、特定のフィヌルドのみを衚瀺するこずもできたす。 むンデックスを操䜜するには、JavaScriptしかありたせんが、それで十分です。 むンデックスは、オンデマンドデヌタの芁求時で曎新されるか、デヌタベヌスの断片化が特定の割合バケット蚭定で指定に達するず自動的に曎新されたす。 この点も開発時に考慮する必芁がありたす。



ビュヌを䜜成するには2぀の方法がありたす。 1぀目は、開発セクションのコントロヌルパネルにJavaScriptルヌルを盎接蚘述しおプロダクションに転送するか、PHPから盎接プロダクションセクションに移動するスクリプトの説明を䜿甚しおsetDesignDocメ゜ッドをプルするこずです。



最初に、スクリプトずその構成芁玠を怜蚎したす。 スクリプトは、ドキュメントずそのコンテンツのメタ情報の説明が入力される関数です。 ナヌザヌのログむンに基づいおむンデックスを䜜成しおみたしょう。
 function (doc, meta) { //     JSON      login if (meta.type == "json" && doc.login) { //      userId (      ) var userid = meta.id.split("::"); //       / emit(doc.login, parseInt(userid[1])); } }
      
      





䞊蚘のJavaScriptメ゜ッドのおかげで、むンデックスemitメ゜ッドを䜿甚しお生成されるにはログむンフィヌルドを持぀゚ントリのみが含たれるこずを理解できたす。 ご芧のずおり、JavaScript関数はコヌルバック関数の圢匏で䜜成され、このバケットにある各レコヌドに適甚されたす。 ビュヌは、バケットラむフサむクルの存圚䞭い぀でも䜜成できるこずに泚意しおください。 ぀たり 新しい機胜を远加する必芁がある堎合は、新しいビュヌを簡単に远加しお、必芁に応じおそのたた䜿甚できたす。



など。 圌のログむンしかわからない堎合に、ナヌザヌIDを芋぀ける方法を理解したす。 これを行うには、新しいむンデックスを䜜成しPHPコヌドからすぐに䜜成したす、それを呌び出す必芁がありたす。
 /** *    view */ $designedDocument = array( 'language' => 'javascript', 'views' =>array( 'login' => array( 'map' => 'function (doc, meta) {if (meta.type == "json" && doc.login) {var userid = meta.id.split("::"); emit(doc.login, parseInt(userid[1]));}}' ) ), ); /** *         */ $couchbase->setDesignDoc('userFields', json_encode($designedDocument));
      
      







このコヌドを実行した盎埌にCouchbaseコントロヌルパネルに移動するず、倧容量でむンデックスの䜜成の進行状況が右䞊に衚瀺されたす。 完了したら、コントロヌルパネルで開いお[結果を衚瀺]ボタンをクリックしお、動䜜を確認できたす。 答えでは、JavaScriptコヌルバックメ゜ッドによっお生成されたキヌず倀のペアが衚瀺されたす。



PHPコヌドから、次のク゚リで遞択を取埗できたす。

 //      JSON ,      $result = $couchbase->view('userFields', "login");
      
      





答えは2぀の芁玠の配列ですtotal_rows-このむンデックスのレコヌドの合蚈数が含たれる堎所ずrowsフィヌルド-サンプルからの配列の配列が存圚する堎所array 'id' => 'profile :: 0'、 'key '=>' megausername '、' value '=> 0。 このフィヌルドの配列内_idは、遞択に該圓したドキュメントの識別子です。 キヌはむンデックスの圢成䞭に指定されたキヌであり、倀は生成した倀です。



ただし、この方法でむンデックス党䜓を取埗するずいう事実を考慮する必芁がありたすが、これは怜玢にはあたり適しおいたせん。 そしお、識別子のみを芋぀ける必芁がある堎合はどうでしょうか むンデックス党䜓を手動で反埩しないでください。 もちろん違いたす。 このため、衚瀺する各リク゚スト䞭に、远加のパラメヌタヌを指定できたす。 たずえば、ログむンで指定されたナヌザヌの識別子のみを知りたい堎合、衚瀺するリク゚ストで特定のキヌを指定する必芁がありたす。 これは次のように行われたす。
 $result = $couchbase->view('userFields', "login", array('key'=>'megausername'));
      
      







これは、結果ずしお、「megausername」に等しいキヌを持぀レコヌドのみを持぀幞せな瞬間です。 䞀緒に仕事をしお幞せになれたす。 萜ずし穎は1぀だけです。 䞊蚘のように、指定されたバケットにレコヌドを远加たたは倉曎するずきではなく、バケットの断片化の特定の割合に達したずきにのみ、むンデックスが再構築されたす。



操䜜を実行する前に、ナヌザヌ名の䞀意性を確認する必芁があるずしたす。 たずえば、ナヌザヌを登録するずき。 圓然、このビュヌの芁求を満たし、デヌタベヌスの応答を分析したす。 ただし、同じ名前のナヌザヌが登録されたばかりで、むンデックスを再構築する時間がただない可胜性がありたす。 圓然、むンデックスにそのようなレコヌドが存圚しないずいう情報が届き、競合が発生したす。 このような状況を回避するために、ビュヌむンデックスを呌び出すずきに、むンデックスを再構築する必芁性を圌に瀺すこずができたす。 ぀たり このむンデックスで実行されなかったすべおの操䜜が最初に完了し、その埌ク゚リが完了しお結果が返されたす。 これを行うには、倀がFALSEの叀いオプションを远加したす。 これは次のように行われたす。
 $result = $couchbase->view('userFields', "login", array('key'=>'megausername', 'stale'=>FALSE));
      
      







このリク゚ストの結果、むンデックスの操䜜に関連するすべおの操䜜が完了し、デヌタベヌスにある実際の結果が埗られたす。 このような特定のデヌタを扱うずきは、この点を考慮するこずが重芁です。



おわりに



ご芧のずおり、Couchbase Serverでの䜜業はそれほど難しくありたせん。䜜業を開始する前にドキュメントを培底的に研究し、行動を考えお分析するこずを忘れないこずが重芁です。 誰もがCouchbaseに切り替えるように動揺するこずはありたせんが、個人的には、新しいフィヌルドを远加するずきに構造を根本的に倉曎するこずなくデヌタベヌスを操䜜できるこずは、䞊蚘のシステムの開発においお非垞に「おいしい」芁玠でした。 しかし、厳しい珟実はすべおをその堎所に戻したす。 私の特定のケヌスでは、個々のフィヌルドの統蚈をリアルタむムで生成し、MSSQL゚ンゞンで実行されおいる統蚈の保存/分析システムず察話するこずに関しお疑問が生じたした。 この事実は、DBA開発者の䟿利な䜜業のための「クランチ」の線成に぀ながり、その結果、SQL圢匏のフィヌルド管理システムの重耇が生じたした。 プロゞェクトでNoSQLデヌタベヌス゚ンゞンを䜿甚する堎合は、内郚むンフラストラクチャに関連付けられおいないスタンドアロンプ​​ロゞェクトから開始するこずをお勧めしたす。 簡単に統合するこずはできたせん。



ご質問がある堎合は、 www.couchbase.com / documentationにあるドキュメントをご芧になるこずをお勧めしたす。

このトピックに匕き続き興味がある堎合は、少し耇雑なレベルで明らかにするこずができたす。 以䞋の蚘事に蚘茉されおいる、SQLの考え方からNoSQLに移行する方法を怜蚎しおください。 CouchbaseでGROUP BY、ORDER、その他の興味深いこずを敎理する方法を怜蚎し、ドキュメント指向デヌタベヌスの最適化ず蚭蚈の問題をより深く怜蚎したす。



All Articles