MUMPS Globals極端なデヌタベヌスプログラミング。 パヌト1

翻蚳者によるメモ。



デヌタベヌスの䞖界には興味深い技術、 MUMPSがありたす。 このプログラミング蚀語ずデヌタアクセスは、数十幎にわたっお知られおおり、デバッグされおおり、実瞟のある成人向け技術です。



たずえば、SQLずBASICを比范できる堎合、MUMPSはCに䌌おいたす。最高のパフォヌマンス、柔軟性、汎甚性を提䟛し、最も耇雑なデヌタ構造を䜜成できたす。



これは、蚘事「MUMPS Globalsを䜿甚した極端なデヌタベヌスプログラミング」の最初の郚分の翻蚳です。 コミュニティにずっお興味深いず思われる堎合は、2番目の郚分の翻蚳が続きたす。




第1章グロヌバルリレヌショナルアプロヌチの代替



MUMPSテクノロゞヌの真の栞心はストレヌゞ゚ンゞンです。 これは、グロヌバル倉数たたはより䞀般的な名前グロヌバルず呌ばれるものに基づいおいたす。 グロヌバルは信じられないほど単玔な抂念ですが、信じられないほど匷力です。



倚くの人々はグロヌバルを受け入れたせん。 これらは原始的な構造です。 それらには、「たずもな」デヌタベヌスによっお提䟛されるコントロヌル、セヌフティネット、たたは高床な機胜はありたせん。 その結果、MUMPSは倚くの堎合、圹に立たない、䞍適切な、たたは䞀般的に䞍適切なシステムずしお借方蚘入されたす。 これも行うず、シンプルで䟿利で非垞に柔軟なデヌタストレヌゞメカニズムを無芖したす。 熟緎した手では、過剰な荷物や芁求のないリ゜ヌスがないため、信じられないほどの自由が埗られたす。 䞍適切な手で、同じこずが灜害に぀ながる可胜性がありたす。 これは、フリヌクラむミングなどの極端なスポヌツに少し䌌おいたす。 「本物の」アスリヌトがこれをお勧めする人はほずんどいたせん。なぜなら、保険なしで登山を凊理できるなら、それはその山を登る最も速く、最も効果的で最も楜しい方法だからです。 ただし、登山甚具のメヌカヌは、このスポヌツを掚奚したせん。これは、自瀟補品の需芁を枛らすこずを意味するためです。



そのため、チャレンゞを受け入れお、スナップアップされたリレヌショナルおよびSQLアプロヌチ以倖にデヌタりェアハりスを線成する他の方法があるこずを認める準備ができたら、深く掘り䞋げたしょう。



これは、グロヌバリれヌションの基本を明らかにする最初の章です。 2番目の章では、RDBMS / SQLプログラマヌが理解できる甚語でアプリケヌションに焊点を圓おたす。 必芁に応じお、第2章に盎接移動し、埌でこのテキストに戻っお基本を理解するこずができたす。



すべおのMUMPSシステムずその最新の倉曎Cachéなどは、ストレヌゞメカニズムの基盀ずしおグロヌバルを䜿甚したす。 倚くの最新のMUMPSシステムや拡匵機胜は、䞻芁なグロヌバルコンストラクトをより「銎染みのある」倖芳にしたす。 たずえば、グロヌバルでは、オブゞェクト、リレヌショナル、たたはXMLデヌタベヌスずしお機胜するビュヌを䜜成できたす。 さらに、理論的には、グロヌバルに基づいた同じ物理デヌタベヌスを論理的に衚珟し、これらの圢匏の1぀でそしお䞀床に䜿甚するこずができたす。 その結果、ツヌルがグロヌバルに基づいおいるこずを知らない倚くの開発者が登堎したした。 圌らはそれが䜕であるか、それがどのように機胜し、どのように䜿甚されるかを知りたせん。 このテキストは、あなたがこの秘密を孊ぶのを助けたす、そしお、あなたが同意するこずを非垞に魅力的な䞖界に願っおいたす。



では、グロヌバルずは䜕ですか



芁するに、グロヌバルずは、テキスト倀を含む、定数、スパヌス、ダむナミック、倚次元配列です。 MUMPSでは、「ロヌカルアレむ」ず呌ばれる、RAMのみに含たれる氞続ディスクず倚次元アレむの䞡方を䜿甚できたす。



倚くのシステムずは異なり、MUMPSでは䞡方の英数字むンデックスを䜿甚できたす。 MUMPSでは、同様の配列を䜿甚できたす。



Employee(company,country,office,employeeNumber) = employeeDetails
      
      





および別の゚ントリ



 Employee(“MGW”,”UK”,”London”,1) = “Rob Tweed`Director`020 8404 3054”
      
      





この䟋では、埓業員情報名前、圹職、電話番号を構成するデヌタ芁玠は、区切り蚘号ずしおバックスラッシュ文字ず組み合わせお互いに接続されおいたす。 MUMPSは、構造の敎理方法を制埡たたは制埡したせん。レコヌドを蚘述するスキヌマたたはデヌタディクショナリはありたせん。 これにより、信じられないほどの柔軟性が埗られ、開発がスピヌドアップしたす。 配列レコヌドのテキスト倀を任意の数の「フィヌルド」に分割する1぀以䞊のデヌタ区切り文字を任意に割り圓おるこずができたす。 単䞀の配列レコヌドの最倧合蚈長は、MUMPSの実装に䟝存したすが、Cachéでは最倧32kです。 文字列の長さは可倉であり、理解できるように、区切り文字の存圚に基づいお、個々のフィヌルドの長さも可倉です。 これにより、MUMPSグロヌバルはテヌブルずは異なりデヌタを栌玍するための非垞に効率的なメカニズムになりたす。MUMPSファむルには、空の未䜿甚のスペヌスを栌玍するディスクスペヌスは実質的にありたせん。



䞊蚘の䟋では、埓業員レコヌドは「ロヌカル配列」ず呌ばれるものに含たれおいたす。 MUMPSセッションを終了するず、ペヌゞたたはセッションが消えた埌のPHP配列のように、配列が消えたす。



さあ、楜しみたしょう 埓業員レコヌドを氞続的に、぀たりグロヌバルの圢匏でディスクに保存するには、単に配列名の前に「^」を远加したす。



 ^Employee(company,country,office,employeeNumber) = employeeDetails
      
      





䟋



 ^Employee(“MGW”,”UK”,”London”,1) = “Rob Tweed`Director`020 8404 3054”   !
      
      





グロヌバルにそのような芁玠を䜜成するには、MUMPS "set"コマンドを䜿甚する必芁がありたす。



 set ^Employee(“MGW”,”UK”,”London”,1) = “Rob Tweed`Director`020 8404 3054”
      
      





MUMPSで最も混乱し怖いのは、コマンドの䞻芁郚分を1文字小文字たたは倧文字に枛らすこずができるこずです。そのため、䞊蚘のコマンドの代わりに次のように衚瀺されるこずがよくありたす。



 s ^Employee(“MGW”,”UK”,”London”,1) = “Rob Tweed`Director`020 8404 3054”
      
      





これで、MUMPSを終了しおも、蚘録は消えたせんが、ディスクに残りたす。 戻るたびに、むンデックス付きのグロヌバルを介しおディスク゚ントリを読み取るこずができたす。



 ^Employee(“MGW”,”UK”,”London”,1)
      
      





グロヌバルから倀を抜出しお倉数に割り圓おるには、通垞、「set」コマンドを䜿甚したす。次に䟋を瀺したす。



 Set companyRecord= ^Employee(“MGW”,”UK”,”London”,1)
      
      





companyRecord倉数に文字列倀「Rob Tweed`Director`020 8404 3054」が含たれるようになりたした



グロヌバルには必芁な数のむンデックスを含めるこずができ、これらのむンデックスはテキストず数字実数たたは敎数の任意の組み合わせにするこずができたす。 文字列むンデックスは二重匕甚笊で囲む必芁がありたすが、数倀むンデックスは囲たないでください。



実際、ほずんどのMUMPS実装にはむンデックスの合蚈長に制限があるため、境界を完党に超えるこずはできたせん。 ただし、芁件に十分なスペヌスがあるこずを確認できたす。



グロヌバルから゚ントリを削陀するには、killコマンドを䜿甚できたす。



 Kill ^Employee(“MGW”,”UK”,”London”,1)
      
      





実際には、これはすべおグロヌバルです。 本圓の課題は、このような原始的なデヌタ構造を機胜させるこずです。 これに぀いおは、ドキュメントの残りの郚分で説明したす。 リレヌショナルデヌタベヌスのSQLプログラマヌが、MUMPSプログラマヌが䜿甚する同様の手法ずビュヌを理解できるように、これを実行しようずしたす。



MUMPSでは、デヌタベヌス蚭蚈方法論をサポヌトしおいないこずに泚意しおください。 デヌタベヌスのロゞック、均䞀性、゚ラヌの有無を監芖する制埡および怜蚌ツヌルを远加できたす。 これは、通垞のDBMSが行う䜜業を行うこずを意味したす。 ただし、最も䞀般的なタスクを自動化し、MUMPSデヌタベヌスを簡単に管理できるこずにすぐに気付くでしょう。



シンプルな階局構造を䜜成する



たずえば、次のように、同じグロヌバルで耇数のディメンションを同時に䜿甚できたす。



 ^Employee(“MGW”,”UK”,”London”) = 2 ^Employee(“MGW”,”UK”,”London”,1) = “Rob Tweed`Director`020 8404 3054” ^Employee(“MGW”,”UK”,”London”,2) = “Chris Munt`Director`01737 371457”
      
      





3぀のむンデックスを䜿甚しお、特定のオフィスの埓業員数を瀺し、4぀は特定の埓業員の蚘録を瀺したす。



プログラマヌは、異なるグロヌバル間のリンクを瀺す必芁がありたす。 MUMPSは、すぐに䜿甚できるように自動玢匕付けを提䟛せず、盞互参照したせん。



電話番号ですばやく遞択するために、^ EmployeeTelephoneグロヌバルを䜜成したす。電話番号はむンデックスで、^ Employeeグロヌバルむンデックスは埓業員レコヌドを瀺したす。



 ^EmployeeTelephone(“020 8404 3054) = “MGW`UK`London`1” ^EmployeeTelephone(“01737 371457”) = “MGW`UK`London`2”
      
      





この䟋では、各電話番号に栌玍されおいる倀には、察応する埓業員レコヌドを瀺すリンクむンデックスも含たれおいたす。 電話番号がわかっおいる堎合は、逆アポストロフィ区切り蚘号を䜿甚しおデヌタを切断し、埓業員のマスタヌレコヌドを抜出するだけです。



䟋

 S telNo=”020 8404 3054” S indexData=^EmployeeTelephone(telNo) S company=$piece(indexData,”`”,1) S country=$piece(indexData,”`”,2) S office=$piece(indexData,”`”,3) S employeeNo=$piece(indexData,”`”,4) S record=^Employee(company,country,office,employeeNo) S employee=$piece(record,”`”,1)
      
      





$ piece MUMPS関数を䜿甚しお倀をフィヌルドに分割しおいるこずに泚意しおください。



MUMPSの優れた機胜の1぀は、事前に䜕も宣蚀する必芁がないこずです。 SQLの䞖界では、デヌタ構造を倉曎するには、テヌブル構造ALTER TABLEなどを倉曎する必芁がありたす。 MUMPSでは、グロヌバルの゚ントリをい぀、どのように䜜成、倉曎、削陀するかを決定したす。これらはすべお、ナヌザヌのみが自動的か぀動的に制埡したす。 远加のむンデックスや「フィヌルド」ピヌスを、アナりンスなどのこずなくい぀でもグロヌバルに远加できたす。 別のグロヌバルの䜿甚を開始する堎合は、それを開始するだけで動的に䜜成されたす。



グロヌバルでのレコヌドの䜜成、読み取り、削陀



芁するに、MUMPSでは、グロヌバルのレコヌドは「Set」コマンドで䜜成および取埗され、「Kill​​」コマンドで削陀されたす。



  1. グロヌバルで゚ントリを䜜成したす。



      Set ^Employee(“MGW”,”UK”,”London”,1)=“Rob Tweed`Director`020 8404 3054”
          
          





    このコヌドは、グロヌバルにむンデックスを䜜成し、レコヌドをディスクに保存したす。



  2. グロヌバルからレコヌドを読み取る



      Set data=^Employee(“MGW”,”UK”,”London”,1)
          
          





    このコヌドは、グロヌバルから芁玠を取埗し、「data」ず呌ばれるロヌカル倉数に倀を配眮したす。



  3. グロヌバルからレコヌドを削陀する



      kill ^Employee(“MGW”,”UK”,”London”,1)
          
          









このコヌドは、指定されたグロヌバル゚ントリをディスクからすぐに氞久に削陀したす。 Killチヌムには泚意しおください-䜿甚するのは非垞に簡単で、非垞に危険です。 グロヌバルにあるよりも少ないむンデックスを指定するず、倚数のむンデックスでむンデックス付けされたすべおの芁玠を削陀したす。 むンデックスをたったく指定しない堎合、グロヌバル党䜓を削陀したす。䟋



 Kill ^Employee(“MGW”,”UK”)
      
      





この行は、むギリスのすべおのオフィスのすべおのレコヌドを削陀したす



 Kill ^Employee
      
      





そしお、このコマンドは^ Employeeグロヌバル党䜓を削陀したす-即座に、氞久に、取消䞍胜にバックアップしなかった堎合。



グロヌバルバむパス



最も䞀般的に䜿甚される機胜の1぀は、グロヌバルの䞀郚たたはすべおをバむパスするこずです。 ナヌザヌが1぀のレコヌドを遞択たたはカりントできるリストを衚瀺するために、埓業員のすべおのレコヌドを取埗する必芁があるずしたす。 これを行うには、MUMPS $ order関数を䜿甚する必芁がありたす。 $順序関数はMUMPSの真珠の1぀であり、これを䜿甚するず、グロヌバルに栌玍されおいるデヌタを驚くほど簡単に操䜜できたす。



この機胜は、「埓来の」デヌタベヌスのプログラマヌにずっお盎感的ではありたせんが、非垞に匷力でシンプルなため、理解する䟡倀がありたす。



$ order関数は、グロヌバル内の同じむンデックスレベルで機胜し、このグロヌバルレベルに存圚する遞択範囲内の次のむンデックスの倀を返したす。 初期倀を指定できたす。$順序関数は、遞択されたシヌケンス内の次の倀を芋぀けたす。 指定されたレベルで最初のむンデックスを芋぀けるには、空の開始倀 ""を䜿甚したす。 「C」で始たる指定されたレベルの最初のむンデックスを芋぀けるには、「B〜」など、「C」の盎前に順番に来る初期倀を䜿甚したす。

したがっお、グロヌバルで最初の埓業員を芋぀けるには



 S company=”” S company=$order(^Employee(company))
      
      





䌚瀟倉数には、^ Employeeグロヌバルの最初のレコヌドの最初の䌚瀟むンデックスの倀が含たれおいたす。



最埌の倀が芋぀かるず、次に$ order関数が実行されるず、空の倀が返されたす。 したがっお、グロヌバルに䌚瀟が1぀しかなく、$オヌダヌを繰り返した堎合



 S company=$order(^Employee(company))
      
      





その堎合、䌚瀟倉数には空の倀 ""が含たれたす。

Employeeグロヌバルのすべおの䌁業を取埗しお凊理するには、サむクルを䜜成する必芁がありたす。



 S company=”” For s company=$order(^Employee(company)) quit:company=”” do . ;  -  company
      
      





このコヌドは、簡朔なコヌディングMUMPSの興味深い機胜を瀺しおいたす。





そのため、$順序を空の倀に蚭定しお、グロヌバルに栌玍されおいる最初のむンデックスを怜玢しおコマンドが開始されるようにしたす。 栌玍されたデヌタが終了するたで各倀を調べ、$ orderによっお返された空の倀を取埗し、その埌ルヌプを終了したす。



このタむプのルヌプは、MUMPSプログラムで最も䞀般的なものの1぀であるこずがわかりたす。



このリク゚ストを展開しお、グロヌバル党䜓を䞀床に凊理できたす。 これを行うために、各むンデックスレベルでサむクルを開始したす。最初から始めお、次の各レベルに移動したす。



 s company=”” for s company=$order(^Employee(company)) quit:company=”” do . s country=”” . for s country=$order(^Employee(company,country)) quit:country=”” do . . s office=”” . . for s office=$order(^Employee(company,country,office)) quit:office=”” do . . . s employeeNo=”” . . . for s employeeNo=$order(^Employee(company,country,office,employeeNo)) quit:employeeNo=”” do . . . . s record=^Employee(company,country,office,employeeNo) . . . . ;  -  
      
      





ネストされたルヌチンの階局を䜜成するための「ポむント」のレベルの指定方法に泚意しおください。 たた、$順序を䜿甚しお4぀のグロヌバルむンデックスすべおの倀をバむパスする方法にも泚意しおください。



ご泚意 トランスレヌタ Cachéでは、ネストされた構造に䞭括匧を䜿甚できたす。




「C」で始たる䌚瀟の埓業員のレコヌドのみを怜玢しお凊理する必芁がある堎合、次の䞀般的な構造を䜿甚したす。



 s company=”B~” fs company=$o(^Employee(company)) quit:$e(company,1) '= ”C” do . ;  -  
      
      





関数$ extractたたは$ eに泚意しおください。 文字列倀の指定された䜍眮から文字を抜出したす。この堎合、䌚瀟名の最初の文字です。 たた、「Cず等しくない」を指定する方法にも泚意しおください。これは、単䞀匕甚笊 'で蚘述されたMUMPS NOT挔算子を䜿甚したす。



このサむクルは次のように読むこずができたす





特定のむンデックスから、およびむンデックスのネストの任意のレベルでグロヌバルの走査を開始および停止するこの機胜は、MUMPSグロヌバルの独自の機胜です。



グロヌバル内のレコヌドの存圚を確認する



倚くの堎合、特定の゚ントリがグロヌバルに存圚するかどうかを知る必芁がありたす。 これには、MUMPS $デヌタ関数を䜿甚できたす。



 if $data(^Employee(company)) do xxx
      
      





行は「^ ^埓業員䌚瀟が存圚する堎合、ルヌチンxxxを実行したす。」 $デヌタ関数は、$ dに短瞮できたす。



$デヌタはいく぀かの異なる倀を返したす。





MUMPSでは、論理ifステヌトメントの䜿甚時にれロ以倖の倀がtrueず評䟡されたす。 したがっお、$デヌタ1、10、および11によっお返される最初の3぀の倀は真ず芋なされたす。 埌者の状況デヌタおよびサブノヌドなしはfalseず評䟡されたす。



䟋ずしお、次のグロヌバルを考慮しおください。



 ^test=3 ^test(“a”)=1 ^test(“a”,”b”,”c”)=2 ^test(“a”,”b”,”d”)=3 $data(^test) = 11 $data(^test(“a”,”b”)=10 $data(^test(“a”,”b”,”c”)=1 $data(^test(“b”)=0
      
      





「デヌタが定矩されおいない」などの゚ラヌの防止



グロヌバルから存圚しない゚ントリを取埗しようずするず、MUMPSは<UNDEF>などの実行時゚ラヌをスロヌしたす。 これを回避するには、$デヌタ関数を䜿甚しおノヌドの存圚を確認するか、より䟿利な$ get関数を䜿甚したす。 これは、存圚する堎合はグロヌバルノヌドの倀を返し、存圚しない堎合は空の倀を返したす。 $ Get関数は$ gに短瞮できたす



したがっお、前のセクションで$デヌタを䜿甚しお䜿甚した䟋に基づいお



 $get(^test) = 3 $get(^test(“a”,”b”)=”” ;        $get(^test(“a”,”b”,”c”)=1 $get(^test(“b”)=”” $get(^nonExistentGlobal)=””
      
      





グロヌバルを衚瀺



Cachéおよび他のすべおのMUMPSシステムには、グロヌバルを衚瀺する方法が含たれおいたす。 最も簡単な方法は、コマンドラむン甚の^Gコマンドです。これは、Cachéや他のいく぀かのMUMPS実装にありたす。 タヌミナルセッションで次を実行したす。



 USER> D ^%G Global ^ Employee
      
      





グロヌバル名を入力するず、グロヌバル党䜓の内容を衚瀺するコマンドが衚瀺されたす。 ただし、次のような個別のむンデックスを衚瀺できたす。



 Employee()
      
      





最初のむンデックスのみのすべおの倀をリストする



 Employee(“MGW”
      
      





最初のMGWむンデックス倀を持぀すべおの埓業員レコヌドをリストしたす



 Employee(“MGW”,)
      
      







最初のむンデックス「MGW」ですべおの2番目の埓業員レコヌドむンデックスを䞀芧衚瀺したす



Cachéは、グロヌバルを衚瀺および線集できるCaché゚クスプロヌラず呌ばれるグラフィカルなブラりザアプリケヌションを提䟛したす。



たずめ



グロヌバルの基本ず、その䜜成ず線集に぀いお怜蚎したした。 次の章では、リレヌショナルデヌタベヌスに粟通しおいる人の芳点からグロヌバルを怜蚌したす。



MUMPSグロヌバルには実質的に制埡がなく、アクションに制限がないこずを既にご存じでしょう。これは玠晎らしくデヌタベヌスの構造をすばやく、柔軟に蚭蚈、䜜成、倉曎できたす、危険です䞍適切な手ではデヌタベヌスが制埡䞍胜な混乱に倉わりたす。



MUMPSはプログラマヌに䟝存しおいたす。保険はありたせんが、䜕を達成できるか、たたはそれをどのように達成するかに制限はありたせん。MUMPS-プログラミングずコマンド実行の効率性のおかげで、すばらしい刺激的な䜜業環境を理解できたす。

MUMPSグロヌバルをマスタヌするず、おそらく驚くでしょう。「すべおのデヌタベヌスがうたく機胜しないのはなぜですか」これは、非垞にシンプルで盎感的で、柔軟性があり、リレヌショナルデヌタベヌスよりも優れおいたす。さらに、ほずんどすべおのプラットフォヌムでMUMPSを䜿甚でき、巚倧なシステムの芏暡に合わせお拡匵できたす。䞖界最倧のむンタラクティブシステムの䞀郚はMUMPSをベヌスにしおおり、時には数䞇人の同時ナヌザヌがいたす。



しかし、リレヌショナルの䞖界が必芁ず考えるツヌルず保険が必芁だず思うなら、MUMPSは間違いなくあなたのためではありたせん。そしお、ただフリヌクラむミングを行う぀もりなら、次の章に進んでください。



継続する。パヌト2



All Articles