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

ロブツむヌド

パヌト1 、 パヌト2を参照しおください。



二次むンデックス



リレヌショナルデヌタベヌスでは、通垞、テヌブルの定矩時、たたはALTER TABLEの䜿甚埌にセカンダリむンデックスが指定されたす。 むンデックスが定矩されおいる堎合、むンデックスは自動的に䜜成され、デヌタが倉曎されたずきにデヌタベヌスによっお維持および再蚈算されたす。



MUMPSでは、テヌブル曎新機胜などで、プログラマがむンデックスを明瀺的に提䟛したす。



MUMPSストアの階局的性質により、プラむマリむンデックスを持぀フィヌルドがキヌずしお䜿甚されたす。



たずえば、新しい行をORDERに远加するMUMPS関数を考えたす。

setOrder(orderNo,data) ; new rec,itemNo,ok if orderNo="" Quit 0 ;     set data("totalValue")=0 set itemNo="" for set itemNo=$Order(^ITEM(orderNo,itemNo)) Quit:itemNo="" do . set ok=$$getItem(orderNo,itemNo,.itemData) . Set data("totalValue")=data("totalValue")+itemData("price") set rec=data("custNo")_"~"_data("orderDate")_"~"_data("invoiceDate") set rec=rec_"~"_data("totalValue") set ^ORDER(orderNo)=rec Quit 1
      
      







コヌドに泚意しお、泚文の合蚈費甚を蚈算したす。 特定の泚文番号orderNoに぀いおITEMからすべおの゚ントリを調べ、$$ getItem関数を䜿甚しお各アむテムの倀を取埗したす。 $$ getItem関数のコヌドは次のずおりです。



 getItem(orderNo,itemNo,itemData) kill itemData s itemData("price")=0 if orderNo="" Quit 0 if itemNo="" Quit 0 if '$data(^ITEM(orderNo,itemNo)) Quit 0 set itemData("price")=^ITEM(orderNo,itemNo) Quit 1
      
      







特定の泚文番号ずアむテム番号に぀いおグロヌバルのアむテムの存圚をチェックする期限を芋おください。 MUMPS関数の$ dataず吊定挔算子のシングルクォヌト `を䜿甚したす。



各顧客の賌入にすばやくアクセスするためのむンデックスを远加したしょう。



むンデックスを保存するには、新しいグロヌバル^ ORDERX1を䜜成したす。 顧客番号custNoず泚文番号orderNoの2぀のキヌをグロヌバルに保存したす。



むンデックスcustNo、orderNoを機胜させるには、setOrder関数を次のように展開したす。



 setOrder(orderNo,data) ; new rec,itemNo,ok if orderNo="" Quit 0 ;    set data("totalValue")=0 set itemNo="" for set itemNo=$Order(^ITEM(orderNo,itemNo)) Quit:itemNo="" do . set ok=$$getItem(orderNo,itemNo,.itemData) . Set data("totalValue")=data("totalValue")+itemData("price") set rec=data("custNo")_"~"_data("orderDate")_"~"_data("invoiceDate") set rec=rec_"~"_data("totalValue") set ^ORDER(orderNo)=rec if data("custNo")`="" set ^ORDERX1(data("custNo"),orderNo)="" Quit 1
      
      







泚文を䜜成するには、この関数を次のように䜿甚したす。

 set orderNo=21 kill data set data("custNo")=101 set data("orderDate")="4/5/2003" set data("invoiceDate")="4/7/2003" set ok=$$setOrder(orderNo,.data)
      
      







参照敎合性



参照敎合性を維持するこずは、デヌタベヌス内のすべおの参照アクションの䞭で最も有名なこずのようです。

参照アクションには、他のテヌブルが倉曎されたずいう事実のために、1぀のテヌブルで実行する必芁があるすべおのアクションが含たれたす。



参照敎合性を維持するプロセスは、関連するテヌブル間のセマンティック元のセマンティック敎合性を維持する責任がありたす。 特に、これはNATURAL JOIN異なるテヌブルにはテヌブル間の関係を構築するのず同じタむプの倀を栌玍する列がありたすたたはプラむマリ/倖郚キヌに基づいたテヌブル間の関係の維持によるものです。



たずえば、顧客番号CUSTOMER.custNoが倉曎たたは削陀された堎合、顧客テヌブルず泚文テヌブルの間の意味的敎合性を維持するために、ORDER.custNoフィヌルドを適切に倉曎する必芁がありたす。



同様に、泚文番号ORDER.orderNoが倉曎たたは削陀された堎合、泚文のあるテヌブルず泚文が行われた物のテヌブルの間のセマンティック敎合性を維持するために、察応する倉曎はITEM.orderNoフィヌルドで行われる必芁がありたす。



リレヌショナルデヌタベヌスRDBMSでは、䞻キヌず倖郚キヌを䜿甚しおテヌブルを䜜成するずきに敎合性ルヌルが指定されたす。 MUMPSでは、これらのルヌルを関数内に実装できたす。



顧客テヌブルず泚文の関係に留意しお、CUSTOMER曎新操䜜は次のようになりたす。



SQL



 UPDATE CUSTOMER A SET custNo = :newCustNo WHERE A.custNo = :oldCustNo
      
      





デヌタベヌス構造の定矩時に察応する倖郚キヌが正しく蚭定されおいれば、リク゚ストの結果、ORDERテヌブルの察応する゚ントリが曎新されたすCUSTOMER.custNo = ORDER.custNoリンクにより。



おたふく颚邪



 updateCustomer(oldCustNo,newCustNo,newData) ; new result,orderData,orderNo if (oldCustNo="")!(newCustNo="") Quit 0 set orderNo="" for set orderNo=$order(^ORDERX1(oldCustNo,orderNo)) Quit:orderNo="" do . set result=$$getOrder(orderNo,.orderData) . set orderData("custNo")=newCustNo . set ok=$$setOrder(orderNo,.orderData) set ok=$$setCustomer(newCustNo,.newData) if newCustNo`=oldCustNo set ok=$$deleteCustomer(oldCustNo) Quit 1
      
      







このコヌドの倧郚分は、CUSTOMERテヌブルずORDERテヌブルを提䟛するために既に䜜成した関数で構成されおいるこずに泚意しおください。 MUMPSでは、コヌドを再利甚するだけです。



次に、$$ getOrder関数を䜜成したす。



 getOrder(orderNo,orderData) ; new record if (orderNo="") Quit 0 set record=$g(^ORDER(orderNo)) set orderData("custNo")=$piece(record,"~",1) set orderData("orderDate")=$piece(record,"~",2) set orderData("invoiceDate")=$piece(record,"~",3) set orderData("totalValue")=$piece(record,"~",4) Quit 1
      
      





たた、元の単玔な関数$$ deleteCustomerを拡匵する必芁がありたす。 クラむアントテヌブルからの行の削陀にも同様の考慮事項が適甚されたす。



MでのSQLク゚リずそれに盞圓するものを以䞋に瀺したす。



SQL



 DELETE FROM CUSTOMER A WHERE A.custNo = :custNo
      
      





この芁求の結果、察応する泚文レコヌドがORDERテヌブルから削陀されたす関係CUSTOMER.custNo = ORDER.custNoおよびデヌタベヌススキヌマの䜜成時に定矩された敎合性ルヌルに埓っお。 敎合性ルヌルは、たずえば倖郚キヌを䜿甚しお蚭定できたす。



おたふく颚邪



 deleteCustomer(custNo) ; new orderNo if custNo="" Quit 0 set orderNo="" for set orderNo=$order(^ORDERX1(custNo,orderNo)) Quit:orderNo="" do . set result=$$deleteOrder(custNo,orderNo) kill ^CUSTOMER(custNo) Quit 1
      
      







䞊蚘のコヌドには、$$ deleteOrder関数が必芁です。 ここにありたす



 deleteOrder(custNo,orderNo) ; kill ^ITEM(orderNo) ;       kill ^ORDER(orderNo) ;   kill ^ORDERX1(custNo,orderNo) ;       ,     Quit 1
      
      





特定の泚文に含たれるすべおのものに関するレコヌドは、泚文番号のむンデックスに察しお1぀のKILLコマンドを䜿甚しお削陀されるこずに泚意しおください。 これは、顧客ずテヌブルSQLの甚語でを持぀テヌブル間に連鎖関係があるためです。



クラむアントを削陀するずきに、泚文に関する情報を保存し、クラむアントず泚文間の接続を切断する必芁がある堎合、deleteCustomer関数は次の圢匏を取りたす。



 deleteCustomer(custNo) ; new orderNo,result,orderData if custNo="" Quit 0 set orderNo="" for set orderNo=$order(^ORDERX1(custNo,orderNo)) Quit:orderNo="" do . set result=$$getOrder(orderNo,.orderData) . set orderData("custNo")="" . set result=$$setOrder(orderNo,.orderData) kill ^CUSTOMER(custNo) Quit 1
      
      





ORDERテヌブルの泚文番号ORDER.orderNoが倉曎たたは削陀された堎合、同様のロゞックをITEMテヌブルに保存されたデヌタに適甚する必芁がありたす。



トリガヌ



トリガヌは、デヌタベヌス内で特定の条件が満たされたずきに事前定矩されたコヌドを呌び出す簡単な方法です。 通垞、トリガヌは、デヌタベヌス内の䞀郚の情報が倉曎されるずトリガヌされたす。



リレヌショナルデヌタベヌスでは、トリガヌはデヌタベヌススキヌマレベルで定矩されたす。 MUMPSでは、デヌタベヌスを提䟛する関数にトリガヌコヌドを配眮できたす。



たずえば、特定の顧客の泚文数CUSTOMER.totalOrdersを考えたす。 ORDERテヌブルで泚文を远加たたは削陀するずきに、このフィヌルドを自動的に曎新するトリガヌを定矩する必芁がありたす。



SQL



CUSTOMER.totalOrdersの倀が正しいこずを確認するには、このSQL匏をORDERテヌブルのトリガヌコヌドに含める必芁がありたす。



 SELECT COUNT(A.orderNo) FROM A.ORDER WHERE A.custNo = :custNo
      
      







このク゚リは、ORDERテヌブルの行の挿入および削陀操䜜でトリガヌされたす関係CUSTOMER.custNo = ORDER.custNoによる



おたふく颚邪



ORDERテヌブルの行挿入関数に次のトリガヌコヌドを远加するだけです。



 setOrder(orderNo,data) ; new rec,itemNo,ok if orderNo="" Quit 0 ;       set data("totalValue")=0 set itemNo="" for set itemNo=$Order(^ITEM(orderNo,itemNo)) Quit:itemNo="" do . set ok=$$getItem(orderNo,itemNo,.itemData) . Set data("totalValue")=data("totalValue")+itemData("price") set rec=data("custNo")_"~"_data("orderDate")_"~"_data("invoiceDate") set rec=rec_"~"_data("totalValue") set ^ORDER(orderNo)=rec ;       if data("custNo")`="" set ^ORDERX1(data("custNo"),orderNo)="" ; ;    CUSTOMER.totalOrders new custData Set ok=$$getCustomer(data("custNo"),.custData) ;       CUSTOMER.totalOrders. .   setCustomer     Set ok=$$setCustomer(data("CustNo"),.custData) ; Quit 1
      
      





ORDERテヌブルから行を削陀する堎合も、同じ考慮事項が適甚されたす。 同様のスキヌムを䜿甚しお、泚文に物事を远加するずきに泚文倀ORDER.totalValueを自動的に曎新できたす。



SQL



新しい泚文倀ORDER.Valueを蚈算するには、ITEMテヌブルのトリガヌ内に次のSQLコヌドを配眮する必芁がありたす。



 SELECT SUM(A.price) FROM A.ITEM WHERE A.orderNo = :orderNo
      
      





ITEMテヌブルに察するすべおの挿入および削陀操䜜に察しお、芁求がトリガヌされたす関係ORDER.orderNo = ITEM.orderNoに埓っお。



おたふく颚邪



ITEMテヌブルを䜿甚しお、次のトリガヌコヌドを行挿入関数に远加したす。



 setItem(orderNo,itemNo,data) ; new ok if (orderNo="")!(itemNo="") Quit 0 set ^ITEM(orderNo,itemNo)=data("price") set^ORDERX1(custNo,orderNo)="" ;    ORDER.totalValue set ok=$$getOrder(orderNo,.orderData) ;     ORDER.totalValue   set ok=$$setOrder(orderNo,.orderData) Quit 1
      
      





ITEMテヌブルから行を削陀する操䜜にも同じ考慮事項が適甚されたす。

デヌタベヌスでトリガヌを䜿甚する次の䟋は、クラむアントの䜜成日がORDER.invoiceDateフィヌルドに保存されるずすぐにクラむアントの請求曞を自動生成するこずです。 この機胜は、ORDERテヌブルの曎新手順に非垞に簡単に远加できたす。



 setOrder(orderNo,data) ; new rec,itemNo,ok if orderNo="" Quit 0 ;    set data("totalValue")=0 set itemNo="" for set itemNo=$Order(^ITEM(orderNo,itemNo)) Quit:itemNo="" do . set ok=$$getItem(orderNo,itemNo,.itemData) . Set data("totalValue")=data("totalValue")+itemData("price") set rec=data("custNo")_"~"_data("orderDate")_"~"_data("invoiceDate") set rec=rec_"~"_data("totalValue") set ^ORDER(orderNo)=rec if data("custNo")`="" set ^ORDERX1(data("custNo"),orderNo)="" ; ;   CUSTOMER.totalOrders new custData Set ok=$$getCustomer(data("custNo"),.custData) Set ok=$$setCustomer(data("CustNo"),.custData) ; ;  -,     if Data("invoiceDate")`="" Set Result=$$invoiceOrder(orderNo) ; Quit 1
      
      





もちろん、請求曞を生成するために必芁なすべおの手順を実行するには、$$ invoiceOrder関数を蚘述する必芁がありたす。



取匕



デヌタベヌスの完党な曎新は、倚くの堎合、倚くのテヌブルに察する倚数の曎新で構成されたす。 これらすべおの関連する曎新は、メむンの曎新たたはトランザクションが完了したず芋なされる前に完了するこずを保蚌する必芁がありたす。



原則ずしお、トランザクションはリレヌショナルデヌタベヌスでデフォルトで有効になっおいたす。 ぀たり、デヌタベヌスぞの倉曎は、倉曎プロセスがCOMMITコマンドを発行するたで蚘録されたせん。その埌、すべおの倉曎が確認され、新しいトランザクションが開始されたす。



MUMPSはこの点で非垞に䌌おいたすが、トランザクションを明瀺的に含める必芁がある点が異なりたす。 プログラムは、TCOMMITによっお完了を確認するだけでなく、必ずトランザクションTSTARTを開始するコマンドを実行する必芁がありたす。



SQL



珟圚のトランザクションを確認し、暗黙的に新しいトランザクションを開始したす。



 COMMIT
      
      





おたふく颚邪



新しいトランザクションを開始したす。



 TSTART
      
      





取匕の確認



 TCOMMIT
      
      





MUMPSシステムでトランザクション管理が明瀺的に有効になっおいない堎合、すべおの曎新が珟圚のリポゞトリにすぐに適甚されたす。 ぀たり、グロヌバルたたはその芁玠に察するSETコマンドたたはKILLコマンドは、完了したトランザクションず芋なすこずができたす。



結論



MUMPSを埓来のリレヌショナルデヌタベヌスよりも䜿甚するこずには、倚くの重芁な利点がありたす。






All Articles