
3. Globaalide kasutamise struktuuri variandid
Struktuur nagu jÀrjestatud puu omab erinevaid erijuhtumeid. Vaatame neid, mis on praktiliselt vÀÀrtuslikud globaalidega töötamisel.
3.1 Erijuhtum 1. Ăks sĂ”lm ilma harudeta
Gloobale vÔib kasutada mitte ainult massiivi moodi, vaid ka tavalisena muutuja. NÀiteks kui loendurina:
Set ^counter = 0 ; loenduri seadistamine
Set id=$Increment(^counter) ; aatomaarne inkrementatsioonSel juhul vĂ”ib globaal, peale vÀÀrtuse, omada ka harusid. Ăks ei vĂ€lista teist.
3.2 Erijuhtum 2. Ăks tipptase ja palju harusid
Ăldiselt â see on klassikaline key-value andmebaas. Ja kui sĂ€ilitame vÀÀrtusena vÀÀrtuste tuple, saame kĂ”ige tavalisema tabeli peamise vĂ”tmega.

Globaalide tabeli rakendamiseks peame me ise vormima read veergude vÀÀrtustest ja seejÀrel need salvestama globaalisse peamise vÔtme jÀrgi. Et lugemisel oleks vÔimalik rida uuesti veergudeks jagada, saab kasutada:
- eraldiste sĂŒmboleid.
Set ^t(id1) = "col11/col21/col31" Set ^t(id2) = "col12/col22/col32" - kindel struktuur, kus iga vÀli vÔtab eelnevalt mÀÀratud arvu baitidest. Nagu seda tehakse relatsioonilistes andmebaasides.
- spetsiaalne funktsioon $LB (olemas Cache'is), mis loob stringi vÀÀrtustest.
Set ^t(id1) = $LB("col11", "col21", "col31") Set ^t(id2) = $LB("col12", "col22", "col32")
Huvitav, et globaalide kasutamine vÔimaldab sarnaseid ehitisi luua nagu teiseste indeksite korral relatsioonilistes andmebaasides. Nimetame neid struktuure indeksigloobideks. Indeksigloob on abivÔime, mis kiirendab otsingut vÀljade kaudu, mis ei ole peamise globaalvÔtme koostisosad. Selle tÀitmiseks ja kasutamiseks on vaja kirjutada tÀiendavat koodi.
Loome indeksigloobi esimese veeru pÔhjal.
Set ^i("col11", id1) = 1
Set ^i("col12", id2) = 1NĂŒĂŒd, et kiire teabe leidmine esimese veeru pĂ”hjal saaks toimuda, peame vaatama globaalidesse ^i ja leidma peamised vĂ”tmed (id), mis vastavad esimese veeru soovitud vÀÀrtusele.
VÀÀrtuse sisestamisel saame kohe luua nii vÀÀrtuse kui ka indeksigloobid vajalike vÀljade jaoks. Ja selle usaldusvÀÀrsuse tagamiseks paneme kÔik selle tehingusse.
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 ridade lisamise/korrigeerimise/kustutamise funktsioonid kirjutada COS/M keeles ja kompileerida.Seda vÀidet olen testinud massiivsete INSERT- ja SELECT-kÀskudega kahemast tÀtabelis, sealhulgas TSTART ja TCOMMIT (tehingute) kÀskude kasutamisega.
Karmimaid stsenaariume, kus on konkurentsitĂŒkk ja paralleelsed tehingud, ei katsetanud.
Ilma tehingute kasutamiseta oli inserteerimise kiirus miljoni vÀÀrtuse puhul 778 361 inserte/s.
300 miljoni vÀÀrtuse puhul â 422 141 inserte/s.
Tehingute kasutamisel â 572 082 inserte/s 50M inserte puhul. KĂ”ik toimingud viidi lĂ€bi kompileeritud M-koodist.
Tavalised kÔvakettad, mitte SSD. RAID5 kirjutamise tagasisidega. Protsessor Phenom II 1100T.
Sarnase SQL-andmebaasi testimiseks tuleb kirjutada salvestatud protseduur, mis tsĂŒkliliselt teeb inserte. MySQL 5.5 (InnoDB salvestus) testimisel sain sellise metoodika jĂ€rgi numbreid, mis ei ĂŒletanud 11K inserte sekundis.
Jah, tabelite rakendamine globaalides nÀeb vÀlja keerulisem kui relatsioonilistes andmebaasides. SeetÔttu on tööstuslikud andmebaasid globaalides SQL-juurdepÀÀsuga, et lihtsustada tabelandmete töötlemist.
Tegelikult, kui andmeskeem ei muutu sageli, andmete sisestamise kiirus ei ole kriitiline ja kogu andmebaasi saab kergesti esitada normaliseeritud tabelite kujul, siis on lihtsam töötada just SQL-iga, kuna see tagab kÔrgema abstraktsiooni taseme.
Selles konkreetses nÀites tahtsin nÀidata, et globaalid vÔivad tegutseda konstruktorina teiste andmebaaside loomiseks. Nagu assembler, mille peal saab kirjutada teisi keeltesse. Siin on nÀited, kuidas globaalides luua analooge
Kui on vaja luua mingisugune mittestandardne andmebaas minimaalsete effortidega, siis tasub vaatama globaalide poole.
3.3 Erijuhtum 3. Kahetasandiline puu, kus iga teise tasandi sÔlmel on fikseeritud arv oksi
Te ilmselt arvasite, et see on alternatiivne tabelite rakendus globaalides. VÔrdleme seda rakendust eelneva pÀrandiga.
Tabelid kahetasandilistes puudes vs. ĂŒhetasandilistes puudes.
Miinused
Plussid
- Aeglasem sisestamisel, kuna tuleb seadistada sÔlmede arv vÔrdne veergude arvuga.
- Rohkem kettaruumi tarbimist. Kuna globaalide indeksid (kui arvuindeksid veergude nimetustega) vÔtavad kettal ruumi ja dubleeritakse iga rea jaoks.
- Kiirem ligipÀÀs ĂŒksikutele veergudele, kuna ei pea rida parsima. Minu testide jĂ€rgi on kiirus 11,5% kiirem kahe veeru puhul ja veelgi kiiremini suurema veergude arvuga.
- Andmeskeemi muutmine on lihtsam.
- Kood on selgem.
VĂ€ljund: Isiklik asi. Kuna kiirus on ĂŒks globaalide peamisi eeliseid, pole selle rakenduse kasutamisel suurt 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, mida saab esitada puuna, sobib suurepÀraselt globaalidele.
3.4.1 Objektid koos alamobjektidega.

See on globaalide traditsiooniline rakendamisala. Meditsiinivaldkonnas on tohutult haigusi, ravimeid, sĂŒmptomeid ja ravimeetodeid. Iga patsiendi kohta miljoneid vĂ€ljad loovutada ei ole mĂ”istlik. Eriti kuna 99% vĂ€ljadest on tĂŒhjad.
Kujutage ette SQL andmebaasi, mis koosneb tabelitest: "patsient" ~ 100 000 vĂ€ljast, "Ravim" â 100 000 vĂ€ljast, "Teraapia" â 100 000 vĂ€ljast, "TĂŒsistused" â 100 000 vĂ€ljast jne. VĂ”i vĂ”ib luua andmebaasi mitmest tuhandest tabelist, igaĂŒhe jaoks kindla patsientide (need vĂ”ivad ju kattuda!), ravi, ravimi ja veel tuhandete tabelite jaoks nende tabelite vaheliste seoste jaoks.
Globaalid sobivad ideaalselt meditsiini jaoks, kuna need vĂ”imaldavad iga patsiendi haigusloo, erinevate teraapiate, ravimite toimimise tĂ€pse kirjelduse loomist puu kujul, raiskamata samal ajal liigset kĂ”vakettaruumi tĂŒhjade veergude jaoks, nagu see oleks suheline juhtum.
Globaalides on mugav luua andmebaasi inimeste andmetega, kui on oluline koguda ja sistematiseerida vÔimalikult mitmekesist teavet kliendi kohta. See on nÔutud meditsiinis, panganduses, turunduses, arhiivitöös ja muudes valdkondades.
.
Ilma kahtluseta saab SQL-is ka emuleerida puu ainult mĂ”ne tabeliga (, ,,,,,,,,,), kuid see on oluliselt keerulisem ja töötleb aeglasemalt. Sisuliselt oleks vaja kirjutada globaalne sĂŒsteem, mis töötleb tabeleid ja peita kogu tabelitega seotud töö abstraktsiooni kihi alla. Madalama taseme tehnoloogiat (gloobuseid) ei tohiks vale kasutada kĂ”rgema taseme vahenditega (SQL). See ei ole mĂ”istlik.
Ei ole saladus, et andmeskeemi muutmine hiiglaslikes tabelites (ALTER TABLE) vÔib vÔtta mÀrkimisvÀÀrselt aega. MySQL, nÀiteks, teostab ALTER TABLE ADD|DROP COLUMN tÀieliku teabe kopeerimise vana tabeli ja uue tabeli vahel (olen testinud mootorit MyISAM, InnoDB). See vÔib ummistada töötava andmebaasi miljardite kirjedega pÀevadeks, kui mitte nÀdalateks.
Andmestruktuuri muutmine, kui kasutame globaale, ei maksa meile midagi. Iga hetk vĂ”ime lisada vajalikud uued omadused igale objekti tasandile hierarhias. Harude ĂŒmbernimetamisega seotud muudatusi saab kĂ€ivitada taustal töötavas andmebaasis.
SeetÔttu, kui jutt on objektide salvestamisest, millel on tohutul hulgal valikulisi omadusi, on globaalid suurepÀrane valik.
Olgu, meenutan, et juurdepÀÀs mistahes omadusele on kohene, kuna globaliseeritud andmebaasid kasutavad B-puude struktuuri.
Globaalid on enamasti dokumentide-pÔhised andmebaasid, mis vÔimaldavad hierarhilise teabe salvestamist. SeetÔttu vÔivad globaliseeritud andmebaasid konkureerida dokumentide-pÔhiste andmebaasidega meditsiiniliste kaustade salvestamise valdkonnas. Kuid see ei ole pÀris sama.VÔtame nÀiteks MongoDB. Selles valdkonnas kaotab ta globaalide ees jÀrgmiste pÔhjuste tÔttu:
- Dokumendi suurus. SalvestusĂŒksus on tekst JSON-formaadis (tĂ€psemalt BSON) maksimaalse mahuga umbes 16 MB. See piirang on kehtestatud spetsiaalselt selleks, et JSON-andmebaas ei aeglustuks, kui sinna salvestatakse tohutu JSON-dokument ja siis sellele vĂ€ljade pĂ”hjal juurde pÀÀsetakse. KĂ€esolevas dokumendis peaks olema koondatud kogu teave patsiendi kohta. Me kĂ”ik teame, kui paksud vĂ”ivad olla patsiendikaardid. 16 MB suurune kaardi piirang paneb kohe punase joone patsientidele, kelle haigusloos on MRT-failid, röntgenpildid ja muud uuringud. Ăhes globaalses haru vĂ”ib aga olla teavet gigabaitide ja terabaitide ulatuses. PĂ”himĂ”tteliselt vĂ”iks selle peale punkti panna, kuid jĂ€tkan.
- Aeg teadlikkuse/uuendamise/kustutamise jaoks uuteks omadusteks patsiendikaardil. Selline andmebaas peab laadima mÀlu kogu kaardi tervikuna (see on suur maht!), parsima BSON-i, lisama/muutma/kustutama uue sÔlme, uuendama indekse, pakkima BSON-iks ja salvestama ketta peale. Globaalil piisab vaid konkreetse omaduse poole pöördumisest ja sellega manipuleerimisest.
- Kergem juurdepÀÀs ĂŒksikutele omadustele. Dokumendis, kus on palju omadusi ja mitmetasandiline struktuur, pÀÀseb ĂŒksikutele omadustele kiiremini juurde, kuna iga tee globaalses sĂŒsteemis on B-puu. BSON-is aga peab dokumenti lineaarset tĂ”lgendama, et leida soovitud omadus.
3.3.2 Assotsiatiivsed massiivid
Assotsiatiivsed massiivid (isegi sisemise massiiviga) sobivad suurepÀraselt globaalseteks. NÀiteks selline massiiv PHP-s kuvatakse esimeses pildis 3.3.1.
$a = array(
"name" => "Vince Medvedev",
"city" => "Moscow",
"threatments" => array(
"surgeries" => array("apediktoomia", "biopsia"),
"radiation" => array("gamma", "röntgen"),
"physiotherapy" => array("pÔlv", "Ôlg")
)
);3.3.3 Hierarhilised dokumendid: XML, JSON
Need salvestatakse globaalsetes sĂŒsteemides samuti lihtsalt. Salvestamiseks saab kasutada erinevaid meetodeid.
XML
XML-i kÔige lihtsam jaotus globaalsetesse struktuuridesse on see, kui sÔlmedes salvestatakse mÀrgeme atribuudid. Kui aga on vajalik kiire juurdepÀÀs mÀrgete atribuudidele, saame need eraldi harudesse viia.

<note id="5">
<to>Vladimir</to>
<from>Svetlana</from>
<heading>Märkus</heading>
<body>Helista mulle homme!</body>
</note>COS-is vastab sellele kood:
Set ^xml("note")="id=5"
Set ^xml("note","to")="Sasha"
Set ^xml("note","from")="Sveta"
Set ^xml("note","heading")="MĂ€letamine"
Set ^xml("note","body")="Helista mulle homme!"MÀrkus: XML, JSON ja assotsiatiivsete massiivide jaoks on vÔimalik vÀlja mÔelda palju erinevaid viise globaalide kuvamiseks. Antud juhul ei kajastatud me note sildis sisetagide jÀrjekorda. Globaalides ^xml sisetagid kuvatakse tÀhestikulises jÀrjekorras. JÀrjekorra tÀpseks kajastamiseks vÔib kasutada nÀiteks sellist kuju:

JSON.
Esimesel pildil jaotises 3.3.1 on kajastatud seda JSON-dokumenti:
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, male avangute andmebaas.
Avangute andmebaas. Node globaalide indeksi vÀÀrtusena vÔib kasutada kÀigu tugevuse hinnangut. Seega, et valida kÔige tugevam kÀik, piisab lihtsalt haru valimisest, mille kaal on suurim. Globaalides on kÔik harud igal tasemel sorteeritud kÀigu tugevuse jÀrgi.

MĂŒĂŒgibĂŒroode struktuur, inimeste struktuur MLM-is. SĂ”lmedes saab hoida teatud vahemĂ€lu vÀÀrtusi, mis peegeldavad kogu alampuu omadusi. NĂ€iteks, selle alampuu mĂŒĂŒgimaht. Igal hetkel saame saada numbri, mis peegeldab ĂŒkskĂ”ik millise haru saavutusi.

4. Millal on globaalide kasutamine kÔige kasulikum
Esimeses veerus on toodud olukorrad, kus globaalide kasutamine toob kaasa mÀrkimisvÀÀrse kiiruskasvu, ja teises, kus lihtsustab arendust vÔi andmemudelit.
Kiirus
Andmete töötlemise/esitamise mugavus
- Sisestamine [automaadse sortimisega igas tasemes], [peamise vÔtme alusel indekseerimisega]
- Alampuude eemaldamine
- Objektid, millel on suur hulk sisemisi omadusi, kellele on vajalik individuaalne juurdepÀÀs
- Hierarhiline struktuur, mis vÔimaldab alamhargnusid lÀbida igast, isegi olemasolematest harudest
- Alampuude sĂŒvitsi lĂ€bimine
- Objektid/ĂŒksused, millel on tohutult palju valikulisi [ja/vĂ”i sisemisi] omadusi/ĂŒksusi
- Schema-less andmed. Kui uued omadused vÔivad sageli tekkida ja vanad kaduda.
- On vaja luua mittestandardsed andmebaasid.
- Teede andmebaasid ja otsustuspuud. Kui teid on mugav esitada puuna.
- Heraldi struktuuride eemaldamine ilma rekursioonita
JĂ€tk .
MĂ€rkus: Antud artikkel ja minu kommentaarid sellele on minu arvamus ja ei oma seost InterSystems korporatsiooni ametliku positsiooniga.
Allikas: habr.com
