
3. Struktuuri variandid globaalide kasutamisel
Seda tĂŒĂŒpi struktuur, nagu jĂ€rjestatud puu, omab erinevaid erijuhtumeid. Vaatame neid, mis on praktiliselt vÀÀrtuslikud globaalide kasutamisel.
3.1 Erijuhtum 1. Ăks sĂ”lm ilma oksi
Globaalide kasutamine ei piira end ainult massiivi sarnasusele, vaid ka tavaliste muutu- ja muude elementide kujul. NĂ€iteks kui loendur:
Set ^counter = 0 ; loenduri seadmine
Set id=$Increment(^counter) ; aatomaarne suurendamineSel juhul vĂ”ib global, lisaks vÀÀrtusele, omada ka oksi. Ăks ei vĂ€lista teist.
3.2 Erijuhtum 2. Ăks tipp ja palju oksi
Ăldiselt on see klassikaline vĂ”tme-vÀÀrtuse baas. Ja kui me salvestame vÀÀrtuse kujul vÀÀrtuste tupikerta, saame tĂ€iesti tavalise tabeli esmase vĂ”tmega.

Tabeli rakendamiseks globaalides peame me ise looma read veergudest ja seejÀrel salvestama need globaalne pÔhivÔtme jÀrgi. Et lugemisel oleks vÔimalik rida jÀlle veergudeks jagada, saab kasutada:
- eraldi sĂŒmboleid.
Set ^t(id1) = "col11/col21/col31" Set ^t(id2) = "col12/col22/col32" - rangeeritud skeemi, kus iga vÀli vÔtab eelnevalt mÀÀratud arvu baite. Nagu seda tehakse relatsioonilistes andmebaasides.
- spetsiaalset funktsiooni $LB (olemas Cache'is), mis koondab vÀÀrtustest mÔne rea.
Set ^t(id1) = $LB("col11", "col21", "col31") Set ^t(id2) = $LB("col12", "col22", "col32")
Mis on huvitav, ei ole globaalide peal mingit erilist vaeva teha midagi sarnast teisejÀrgulistele indeksitele relatsioonilistes andmebaasides. Nimetame selliseid struktuure indeksiteks globaalideks. Indeksi globaal on abipuu kiiremate otsingute jaoks, mis ei ole esmaste vÔtmete koostisosad pÔhigloobalis. Selle tÀitmiseks ja kasutamiseks tuleb kirjutada tÀiendav kood.
Loo nÀiteks indeks globaal esimese veeru peal.
Set ^i("col11", id1) = 1
Set ^i("col12", id2) = 1NĂŒĂŒd kiiremaks teabe saamiseks esimeses veerus peame pilku heitma globaalile ^i ja leidma esmased vĂ”tmed (id), mis vastavad esimese veeru soovitud vÀÀrtusele.
VÀÀrtuse sisestamisel saame kohe luua nii vÀÀrtuse kui ka indeks globaalid vajalike vĂ€ljade jaoks. Ja usaldusvÀÀrsuse nimel ĂŒmbritseme kĂ”ik selle tehinguga.
TSTART
Set ^t(id1) = $LB("col11", "col21", "col31")
Set ^i("col11", id1) = 1
TCOMMITDetailid, kuidas M-is teha , .
Sellised tabelid töötavad sama kiiresti kui traditsioonilistes andmebaasides (vĂ”i isegi kiiremini), kui salvestamis-/uuendamis-/kustutamisfunktsioonid on kirjutatud COS/M-is ja kompileeritud.Seda vĂ€idet olen testinud massiliste INSERT- ja SELECT-kĂ€skudega ĂŒhes kahe veeruga tabelis, sealhulgas TSTART ja TCOMMIT (tehingute) kasutamisega.
Rohkem keerulisi stsenaariume konkurentsi ja paralleelsete tehingutega ei ole testitud.
Ilma tehingute kasutamiseta oli inserteerimise kiirus miljoni vÀÀrtuse juures 778 361 inserte/sekundis.
300 miljoni vÀÀrtuse juures â 422 141 inserte/sekundis.
Tehingute kasutamisega â 572 082 inserte/sekundis 50M inserte. KĂ”ik operatsioonid viidi lĂ€bi kompileeritud M-koodiga.
Tavalisest kÔvakettast, mitte SSD. RAID5 Write-back'iga. Protsessor Phenom II 1100T.
Sarnaste SQL-andmebaaside testimiseks tuleb kirjutada salvestatud protseduur, mis tsĂŒklis teeb inserte. MySQL 5.5 (InnoDB salvestus) testimisel sain sel moel numbreid mitte suuremaid kui 11K inserte sekundis.
Jah, globaalsetes tabelite rakendamine tundub keerulisem kui relatsioonilistes andmebaasides. SeetÔttu on tööstuslikud andmebaasid globaalides SQL-juurdepÀÀsuga, et lihtsustada tabelandmetega töötamist.
Ăldiselt, kui andmemudelit ei muudeta sageli, ei ole sisestuse kiirus kriitiline ning kogu andmebaasi on lihtne esitada normeeritud tabelite kujul, siis on lihtsam töötada just SQL-iga, kuna see tagab kĂ”rgema abstraktsiooni taseme.
Selles konkreetses olukorras tahtsin nÀidata, et globaalid vÔivad toimida kui konstruktor teiste andmebaaside loomiseks. Nagu assembleerija, millel on vÔimalik kirjutada teisi keeli. Siin on nÀited, kuidas globaalides luua analooge
Kui on vaja luua mingisugune mittestandardsed andmebaas minimaalsete pingutustega, tasub vaadata globaalide poole.
3.3 Eriline juhtum 3. Kahetasandiline puu, kus iga teise tasandi sÔlmel on fikseeritud arv oksasid
Te kindlasti aimasite: see on alternatiivne globaalide tabelite rakendamine. VÔrdleme seda eelneva rakendusega.
Kahetasandilised tabelid vs. ĂŒhetasandilised tabelid.
Miinused
Plussid
- Aeglaseim inserteerimisel, kuna on vaja seadistada sÔlmede arv, mis vastab veergude arvule.
- Tingimuste tÔttu suureneb ketta ruumi tarbimine, kuna globaalsete indeksite (arvutuste jaoks nagu massiivide indeksid) veergude nimede jaoks kasutatakse ruumi ja need dubleeritakse iga rea jaoks.
- ErakuupĂ€evade vÀÀrtuste kiirem juurdepÀÀs, kuna realt ei pea andmeid analĂŒĂŒsima. Minu testide pĂ”hjal on see 11,5% kiiremini kahe veeru puhul ja veelgi kiiremini suurema hulga veergudega.
- Andmeskeemi muutmine on lihtsam.
- Kood on selgem.
KokkuvĂ”te: isikliku maitse asi. Kuna kiirus on ĂŒks peamisi globaalsete eeliste, siis pole sellise rakenduse kasutamine peaaegu mĂ”tet, kuna see tĂ”enĂ€oliselt ei tööta kiiremini kui tabelid relatsioonilistes andmebaasides.
3.4 Ăldjuhtum. Puud ja jĂ€rjestatud puud.
Iga andmestruktuur, mis saab olema esitatud puuna, sobib suurepÀraselt globaalidele.
3.4.1 Objektid alamobjektidega.

See on traditsiooniline globaalide rakenduste valdkond. Meditsiinis on tohutult haigusi, ravimeid, sĂŒmptomeid ja raviviise. Iga patsiendi jaoks miljoni vĂ€lja tabeli loomine pole ratsionaalne, eriti kuna 99% vĂ€ljadest on tĂŒhjad.
Kujutage ette SQL andmebaasi tabelitega: "patsient" ~ 100 000 vĂ€li, "Ravim" â 100 000 vĂ€li, "Ravi" â 100 000 vĂ€li, "TĂŒsistused" â 100 000 vĂ€li jne. VĂ”i saab luua andmebaasi, mis koosneb kĂŒmnetest tuhandetest tabelitest, igaĂŒks mÀÀratud konkreetse patsienditĂŒĂŒbi, ravivĂ”imaluse, ravimite jaoks ning veel tuhandete tabelite jaoks nende tabelite vaheliste suhete loomiseks.
Globaalid sobivad ideaalselt meditsiinile, kuna need vĂ”imaldavad luua iga patsiendi tĂ€pse kirjelduse tema haigusloost, erinevatest raviviisidest, ravimite toimest puu kujul, raiskamata samas liigset ketta ruumi tĂŒhjade veergude jaoks, nagu see oleks relatsioonilistes sĂŒsteemides.
Globaalide abil on mugav luua andmebaas inimesi puudutavate andmetega,, kui on oluline koguda ja sĂŒsteemida maksimaalselt mitmekesist teavet kliendi kohta. Seda vajatakse meditsiinis, panganduses, turunduses, arhiivinduses ja teistes valdkondades.
.
Muidugi on ka SQL-is vÔimalik simuleerida puud mÔne tabeliga (, ,,,,,,,,,), kuid see on oluliselt keerulisem ja töötab aeglasemalt. PÔhimÔtteliselt oleks vaja kirjutada globaalne töö, mis toimib tabelite peal ja peita kogu tabelitega seotud töö abstraktsiooni kihi alla. Ei ole Ôige emuleerida madalama taseme tehnoloogiat (globaalid) kÔrgema taseme vahenditega (SQL). See ei ole otstarbekas.
Ei ole saladus, et andmeskeemi muutmine hiiglaslikes tabelites (ALTER TABLE) vÔib vÔtta mÀrkimisvÀÀrselt aega. MySQL, nÀiteks, teeb ALTER TABLE ADD|DROP COLUMN tÀieliku teabe kopeerimise vanast uude tabelisse (olen testinud mootorite MyISAM ja InnoDB). See vÔib töödelda andmebaasi miljardite kirjadega pÀevi, kui mitte nÀdalaid.
Andmestruktuuri muutmine, kui kasutame globaale, ei maksa meile midagi. Me vĂ”ime igal hetkel lisada kĂ”ik vajalikud uued omadused igale objektile, igal hierarhia tasemel. Muudatused, mis on seotud harude ĂŒmbernimetamisega, saab taaskĂ€ivitada töötava andmebaasi taustal.
SeetÔttu on, kui jutt kÀib objektide salvestamisest, kus on tohutult valikulisi omadusi, globaalid suurepÀrane valik.
Pealegi, meenutan, et juurdepÀÀs igale omadusele on kohene, kuna globaalides on kÔik teed B-puu kujul.
Globaalidel pĂ”hinevad andmebaasid on ĂŒldiselt dokumentide, mis on orienteeritud andmebaaside tĂŒĂŒp, millel on vĂ”imalus salvestada hierarhilist teavet. SeetĂ”ttu saavad globaalid meditsiiniliste kaartide salvestamise valdkonnas konkureerida dokumentide orienteeritud andmebaasidega. Kuid see ei ole pĂ€ris see.VĂ”tame nĂ€iteks MongoDB. Selles valdkonnas kaotab ta globaalidele jĂ€rgmiste pĂ”hjuste tĂ”ttu:
- Dokumendi suurus. Salvestamise ĂŒhik on tekst JSON-formaadis (tĂ€psemalt BSON), maksimaalse mahuga umbes 16 MB. Piirang on tehtud spetsiaalselt selleks, et JSON-andmebaas ei takerduks parsimise ajal, kui seal salvestatakse hiiglaslik JSON-dokument ja seejĂ€rel sellele vĂ€ljade kaudu ligipÀÀsetakse. Selles dokumendis peaks olema kogu teave patsiendi kohta. Me kĂ”ik teame, kui paksud vĂ”ivad olla patsiendi kaardid. Maksimaalne kaardi suurus 16 MB seadis kohe piirangud patsientidele, kelle haigusajaloo kaartidesse on lisatud MRT-failid, röntgeni- ja teiste uuringute skaneeringud. Ăhes globaalide haru vĂ”ib aga olla teavet gigabaitide ja terabaitidena. PĂ”himĂ”tteliselt vĂ”iks selle peale kĂŒll punkti panna, kuid ma jĂ€tkan.
- Teadvuse / muutmise / uute omaduste kustutamise aeg patsiendi kaardil. Selline andmebaas peab mĂ€letama kogu kaardi korraga (see on suur maht!), parsima BSON-i, lisama / muutma / kustutama uue sĂ”lme, uuendama indekseid, pakkima BSON-i, salvestama kettale. Globaalile piisab vaid konkreetse omaduse juurde pÀÀseda ja selle ĂŒle toimingud teha.
- Kaasneva omaduste kiirus. Paljude omaduste ja dokumendi mitmeastmelise struktuuri puhul on juurdepÀÀs ĂŒksikutele omadustele kiirem, kuna iga tee globaali on B-puu. BSON-i puhul peab dokumendi leidmiseks vajalikku omadust leidma lineaarselt.
3.3.2 Associatiivsed massiivid
Associatiivsed massiivid (isegi sisseviidud massiividega) sobivad suurepÀraselt globaalidele. NÀiteks, selline massiiv PHP-st kuvatakse esimese pildina 3.3.1.
$a = array(
"name" => "Vince Medvedev",
"city" => "Moscow",
"threatments" => array(
"surgeries" => array("apedicectomy", "biopsy"),
"radiation" => array("gamma", "x-rays"),
"physiotherapy" => array("knee", "shoulder")
)
);3.3.3 Hierarhiilised dokumendid: XML, JSON
Ka neid saab globaalides kergesti salvestada. Salvestamiseks saab andmeid erinevalt jagada.
filestream
Lihtsaim viis XML-i jagamiseks globaalideks on see, kui salvestame tippude attribuudid. Kui on vajalik kiire juurdepÀÀs tippude atribuutidele, saame need vÀlja tuua eraldi harudesse.

<note id="5">
<to>Vasya</to>
<from>Svetlana</from>
<heading>Märkus</heading>
<body>Helista mulle homme!</body>
</note>COS-ile vastab sellele kood:
Set ^xml("note")="id=5"
Set ^xml("note","to")="Sasha"
Set ^xml("note","from")="Svetlana"
Set ^xml("note","heading")="MĂ€leta"
Set ^xml("note","body")="Helista mulle homme!"MĂ€rkus: XML-i, JSON-i ja associatiivsete massiivide korral on vĂ”imalik vĂ€lja mĂ”elda palju erinevaid viise globaalideks jagamiseks. Antud juhul ei peegeldanud me tippude note jĂ€rjekorda. Globaalide ^xml sĂŒvendi mĂ€rgid kuvatakse tĂ€hestikulises jĂ€rjekorras. JĂ€rjekorra tĂ€pseks peegeldamiseks saab kasutada nĂ€iteks sellist kuvamist:

JSON.
Osas 3.3.1 on nÀidatud selle JSON-dokumentide peegeldamine:
var document = {
"name": "Vince Medvedev",
"city": "Moscow",
"threatments": {
"surgeries": ["apedicectomy", "biopsy"],
"radiation": ["gamma", "x-rays"],
"physiotherapy": ["knee", "shoulder"]
},
};3.3.4 Ăhesugused struktuurid, mis on seotud hierarhiliste suhetega
NĂ€ited: mĂŒĂŒgibĂŒroode struktuur, inimeste paigutus MLM-struktuuris, malemĂ€ngude avangude andmebaas.
Avangude andmebaas. Globaalne sÔlme indeksi vÀÀrtusena vÔib kasutada kÀigu tugevuse hinnangut. Sel juhul piisab, kui valida haru, millel on suurim kaal, et valida tugevaim kÀik. Globaalsetes sÔlmedes sorteeritakse kÔik harud igal tasemel kÀigu tugevuse jÀrgi.

MĂŒĂŒgibĂŒroode struktuur, inimesed MLM-is. SĂ”lmedes saab salvestada teatud vahemĂ€llu salvestatud vÀÀrtusi, mis peegeldavad kogu alampuu omadusi. NĂ€iteks selle alampuu mĂŒĂŒgimaht. Igal ajal saame saada numbri, mis peegeldab mis tahes haru saavutusi.

4. Millal on globaale kÔige kasulikum kasutada?
Esimeses veerus on toodud olukorrad, kus globaale kasutades saate mÀrkimisvÀÀrset kasu kiirusest, ja teises, kus lihtsustub arendamine vÔi andmemudel.
Kiirus
Andmete töötlemise/mugav esitlemine.
- Sisestamine [automaatse sortimisega igal tasemel], [indekseerimine pÔhivÔtme jÀrgi].
- Alampuude eemaldamine.
- Objektid, millel on palju sisemisi omadusi, millele on vajalik individuaalne juurdepÀÀs.
- Hierarhiline struktuur, mille saab lÀbida lapseharudega, isegi mitteeksisteerivatega.
- Alampuude lĂ€bitavus sĂŒgavusele.
- Objektid/olekud, millel on tohutult valikulisi [ja/vÔi sisemisi] omadusi/olekuid.
- Scheemivabad andmed (schema-less). Kui uusi omadusi vÔib sageli lisanduda ja vanadest omadustest vabaneda.
- Peab looma mittestandardse andmebaasi.
- Teede ja otsustuspuude andmebaasid. Kui teed on mugavam esitada puu kujul.
- Hierarhiliste struktuuride eemaldamine ilma rekursioonita.
JĂ€tkub .
MĂ€rkus: See artikkel ja minu kommentaarid sellele on minu arvamus ning ei kajasta InterSystems korporatsiooni ametlikku seisukohta.
Allikas: habr.com
