Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osa

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osaAlustamine – vaata 1. osa.

3. Struktuuride variandid globaalide kasutamisel

Struktuuril, näiteks järjestatud puul, on mitmesuguseid erijuhtumeid. Vaatleme neid, millel on globaalidega töötamisel praktiline väärtus.

3.1 Erijuhtum 1. Üks sõlm ilma harudeta


Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osaGlobaale saab kasutada mitte ainult massiivina, vaid ka tavaliste muutujatena. Näiteks loendurina:

Set ^counter = 0  ; установка счётчика
Set id=$Increment(^counter) ;  атомарное инкрементирование

Sel juhul võib globaalsel lisaks oma tähendusele olla ka harusid. Üks ei välista teist.

3.2 Erijuhtum 2. Üks tipp ja palju harusid

Üldiselt on see klassikaline võtmeväärtuste alus. Ja kui salvestame väärtusena hulga väärtusi, saame väga tavalise primaarvõtmega tabeli.

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osa

Globaalsete tabelite rakendamiseks peame ise veeru väärtustest genereerima read ja seejärel salvestama need primaarvõtme abil globaalsesse tabelisse. Et võimaldada stringi lugemisel uuesti veergudeks jagada, võite kasutada:

  1. eraldusmärgid.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. jäik skeem, milles iga väli hõivab etteantud arvu baite. Nagu relatsiooniandmebaasides tehakse.
  3. spetsiaalne funktsioon $LB (saadaval vahemälus), mis loob väärtuste jada.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Huvitaval kombel pole keeruline kasutada globaalseid väärtusi, et teha midagi sarnast relatsiooniandmebaaside sekundaarsete indeksitega. Nimetagem selliseid indeksi struktuure globaalseteks. Globaalne indeks on abipuu väljade kiireks otsimiseks, mis ei kuulu peamise globaalse võtme primaarvõtmesse. Selle täitmiseks ja kasutamiseks tuleb kirjutada lisakood.

Loome esimesse veergu globaalse indeksi.

Set ^i("col11", id1) = 1
Set ^i("col12", id2) = 1

Nüüd peame esimesest veerust teabe kiireks otsimiseks vaatama globaalset ^i ja leidke esmased võtmed (id), mis vastavad esimese veeru soovitud väärtusele.

Väärtuse sisestamisel saame kohe luua nii väärtuse kui ka indeksi globaalsed vajalikud väljad. Ja usaldusväärsuse huvides mähigem see kõik tehingusse.

TSTART
Set ^t(id1) = $LB("col11", "col21", "col31")
Set ^i("col11", id1) = 1
TCOMMIT

Üksikasjad selle kohta, kuidas seda M-il teha tabelid globaalsete kohta, sekundaarsete indeksite emuleerimine.

Sellised tabelid töötavad sama kiiresti kui traditsioonilistes andmebaasides (või isegi kiiremini), kui ridade sisestamise/värskendamise/kustutamise funktsioonid on kirjutatud COS/M-is ja kompileeritud.Kontrollisin seda väidet hulgi INSERT ja SELECT testidega ühte kaheveerulisesse tabelisse, sealhulgas kasutasin käske TSTART ja TCOMMIT (tehingud).

Ma ei ole testinud keerukamaid stsenaariume samaaegse juurdepääsu ja paralleelsete tehingutega.

Ilma tehinguid kasutamata oli sisestamise määr 778 361 lisamist sekundis miljoni väärtuse kohta.
300 miljoni väärtusega - 422 141 sisestust sekundis.

Tehingute kasutamisel - 572 082 sisestust sekundis 50M lisade puhul. Kõik toimingud viidi läbi kompileeritud M-koodist.
Kõvakettad on tavalised, mitte SSD. RAID5 koos tagasikirjutamisega. Phenom II 1100T protsessor.

SQL-andmebaasi testimiseks sarnasel viisil peate kirjutama salvestatud protseduuri, mis teostab sisestusi tsüklis. MySQL 5.5 (InnoDB salvestusruumi) testimisel sain seda meetodit kasutades numbreid mitte rohkem kui 11 XNUMX lisamist sekundis.
Jah, tabelite rakendamine globaalsetel andmetel tundub keerulisem kui relatsiooniandmebaasides. Seetõttu on globaalsetel tööstuslikel andmebaasidel SQL-juurdepääs, et lihtsustada tööd tabeliandmetega.

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osaÜldiselt, kui andmeskeem ei muutu sageli, sisestamise kiirus pole kriitiline ja kogu andmebaasi saab hõlpsasti esitada normaliseeritud tabelite kujul, on SQL-iga lihtsam töötada, kuna see tagab kõrgema abstraktsioonitaseme. .

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osaSel konkreetsel juhul tahtsin seda näidata globalid võivad toimida teiste andmebaaside loomise konstruktorina. Nagu assembler, milles saab kirjutada ka teisi keeli. Siin on näited selle kohta, kuidas saate luua analooge globaalsetel seadmetel võtmeväärtus, loendid, komplektid, tabelid, dokumendile orienteeritud andmebaasid.

Kui teil on vaja minimaalse vaevaga luua mingi ebastandardne andmebaas, siis peaksite vaatama globaalsete andmete poole.

3.3 Erijuhtum 3. Kahetasandiline puu, igal teise taseme sõlmel on kindel arv harusid

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osaTõenäoliselt arvasite ära: see on globaalsete tabelite alternatiivne rakendus. Võrdleme seda teostust eelmisega.

Tabelid kahetasandilisel puul vs. ühetasandilisel puul.

Miinused
Plusse

  1. Sisestamiseks aeglasem, kuna peate määrama sõlmede arvu võrdseks veergude arvuga.
  2. Suurem kettaruumi tarbimine. Kuna globaalsed indeksid (mida mõistetakse massiiviindeksitena) veergude nimedega võtavad kettaruumi ja dubleeritakse iga rea ​​jaoks.

  1. Kiirem juurdepääs üksikute veergude väärtustele, kuna stringi pole vaja sõeluda. Minu testide järgi on see 11,5 veeru puhul 2% kiirem ja suuremal hulgal veergudel rohkem.
  2. Lihtsam muuta andmeskeemi
  3. Selgem kood

Järeldus: mitte kõigile. Kuna kiirus on globaalsete andmete üks peamisi eeliseid, pole selle rakenduse kasutamisel mingit mõtet, kuna see ei tööta tõenäoliselt kiiremini kui relatsiooniandmebaaside tabelid.

3.4 Üldjuhtum. Puud ja tellitud puud

Igasugune andmestruktuur, mida saab esitada puuna, sobib ideaalselt globaalsete andmetega.

3.4.1 Alamobjektidega objektid

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osa

See on globaalsete traditsiooniliste kasutusalade valdkond. Meditsiinivaldkonnas on tohutult palju haigusi, ravimeid, sümptomeid ja ravimeetodeid. On ebaratsionaalne luua iga patsiendi kohta tabel miljoni väljaga. Veelgi enam, 99% väljadest jäävad tühjaks.

Kujutage ette SQL-i tabelite andmebaasi: "patsient" - 100 000 välja, "meditsiin" - 100 000 välja, "teraapia" - 100 000 välja, "tüsistused" - 100 000 välja jne. ja nii edasi. Või saate luua andmebaasi tuhandetest tabelitest, millest igaüks sisaldab konkreetset tüüpi patsiendi (ja need võivad kattuda!), ravimeetodite, ravimite ja veel tuhandete tabelitega nende tabelite vaheliste ühenduste jaoks.

Globaalid sobivad ideaalselt meditsiiniks, kuna võimaldavad luua iga patsiendi jaoks täpse kirjelduse tema haigusloost, erinevatest ravimeetoditest ja ravimite toimimisest puu kujul, ilma et raiskaks täiendavat kettaruumi tühjade veergude peale. olema nii relatsioonilisel juhul.

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osaGlobaalide abil on mugav luua andmebaasi inimeste andmetega, kui on oluline koguda ja süstematiseerida maksimaalselt mitmesugust infot kliendi kohta. See on nõutud meditsiinis, panganduses, turunduses, arhiivinduses ja muudes valdkondades

.
Muidugi saab SQL-is emuleerida ka puud vaid mõne tabeliga (EAV, 1,2,3,4,5,6,7,8,9,10), kuid see on oluliselt keerulisem ja aeglasem. Põhimõtteliselt peaksite kirjutama globaalse, mis töötab tabelitel ja peitma kogu tabelitega töö abstraktsioonikihi alla. On vale jäljendada madalama taseme tehnoloogiat (globaale), kasutades kõrgema taseme tehnoloogiat (SQL). Sobimatu.

Pole saladus, et hiiglaslike tabelite andmeskeemi muutmine (ALTER TABLE) võib võtta üsna palju aega. Näiteks MySQL muudab ALTER TABLE ADD|DROP COLUMN'i, kopeerides teabe täielikult vanast tabelist uude tabelisse (testitud MyISAM, InnoDB mootorid). Mis võib miljardeid kirjeid sisaldava toimiva andmebaasi riputada päevadeks, kui mitte nädalateks.

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osaAndmestruktuuri muutmine, kui kasutame globaalseid andmeid, ei maksa meile midagi. Igal ajal saame lisada mis tahes objektile uusi omadusi, mida vajame, igal hierarhia tasemel. Harude ümbernimetamisega seotud muudatusi saab käivitada töötavas andmebaasis taustal.


Seetõttu on suure hulga valikuliste omadustega objektide salvestamisel globaalsed omadused suurepärane valik.

Veelgi enam, lubage mul teile meelde tuletada, et juurdepääs kõigile omadustele on kohene, kuna globaalselt on kõik teed B-puud.

Üldjuhul on globaalsed andmebaasid teatud tüüpi dokumendile orienteeritud andmebaasid, millel on võimalus salvestada hierarhilist teavet. Seetõttu suudavad dokumendile orienteeritud andmebaasid konkureerida globaalsetega meditsiiniliste dokumentide säilitamise vallas. Aga see pole ikka päris samaVõtame võrdluseks MongoDB. Selles domeenis see kaotab maailmadele järgmistel põhjustel:

  1. Dokumendi suurus. Salvestusseade on JSON-vormingus tekst (täpsemalt BSON), mille maksimaalne maht on umbes 16 MB. Piirang tehti spetsiaalselt selleks, et JSON-i andmebaas ei aeglustaks sõelumise ajal, kui sinna salvestatakse tohutu JSON-dokument ja seejärel pääseb sellele juurde väljade kaudu. See dokument peab sisaldama kogu teavet patsiendi kohta. Me kõik teame, kui paksud võivad patsientide andmed olla. Kaardi maksimaalne suurus 16 MB teeb kohe lõpu patsientidele, kelle haiguskaardil on MRT-failid, röntgenuuringud ja muud uuringud. Ühes maailma harus võib teil olla gigabaite ja terabaite teavet. Põhimõtteliselt saame sellele lõpu teha, aga ma jätkan.
  2. Patsiendi kaardil teadvustamise/muutuste/uute omaduste kustutamise aeg. Selline andmebaas peab lugema kogu kaardi mällu (see on suur hulk!), parsima BSON-i, lisama/muutma/kustutama uue sõlme, uuendama indekseid, pakkima selle BSON-i ja salvestama kettale. Globaalne vajab ainult juurdepääsu konkreetsele atribuudile ja sellega manipuleerimist.
  3. Kiire juurdepääs üksikutele kinnistutele. Kuna dokumendis on palju atribuute ja selle mitmetasandiline struktuur, on juurdepääs üksikutele atribuutidele kiirem, kuna iga tee globaalses on B-puu. BSON-is peate soovitud atribuudi leidmiseks dokumendi lineaarselt sõeluma.

3.3.2 Assotsiatiivsed massiivid

Assotsiatiivsed massiivid (isegi pesastatud massiividega) sobivad ideaalselt globaalsetele massidele. Näiteks PHP-st pärit massiiv kuvatakse esimesel pildil 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 Hierarhilised dokumendid: XML, JSON

Samuti salvestatakse hõlpsalt globaalsetesse kohtadesse. Ladustamiseks saab paigutada erineval viisil.

XML
Lihtsaim viis XML-i globaalseteks sõelumiseks on salvestada sildi atribuudid sõlmedesse. Ja kui on vaja kiiret juurdepääsu sildi atribuutidele, saame need teisaldada eraldi harudesse.

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osa

<note id=5>
<to>Вася</to>
<from>Света</from>
<heading>Напоминание</heading>
<body>Позвони мне завтра!</body>
</note>

COS-is vastaks see koodile:

Set ^xml("note")="id=5"
Set ^xml("note","to")="Саша"
Set ^xml("note","from")="Света"
Set ^xml("note","heading")="Напоминание"
Set ^xml("note","body")="Позвони мне завтра!"

Märkus: XML-i, JSON-i ja assotsiatiivsete massiivide jaoks saate välja pakkuda palju erinevaid globaalsetes kuvamisviise. Sel juhul ei kajastanud me märkmesildis alammärgendite järjekorda. Globaalselt ^xml alamsildid kuvatakse tähestikulises järjekorras. Tellimuse täpseks kajastamiseks võite kasutada näiteks järgmist kuva:

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osa
JSON.
Esimene pilt jaotisest 3.3.1 näitab selle JSON-dokumendi peegeldust:

var document = {
  "name": "Vince Medvedev",
  "city": "Moscow",
  "threatments": {
    "surgeries": ["apedicectomy", "biopsy"],
    "radiation": ["gamma", "x-rays"],
    "physiotherapy": ["knee", "shoulder"]
  },
};

3.3.4 Hierarhiliste suhetega ühendatud identsed struktuurid

Näited: müügikontorite struktuur, inimeste paiknemine MLM-i struktuuris, maleavade andmebaas.

Debüüt andmebaas. Löögijõu hinnangut saate kasutada globaalse sõlme indeksi väärtusena. Seejärel piisab tugevaima käigu valimiseks kõige suurema raskusega haru valimisest. Globaalses plaanis sorteeritakse kõik harud igal tasemel liikumise tugevuse järgi.

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osa

Müügikontorite struktuur, inimeste struktuur MLM-is. Sõlmed võivad salvestada teatud vahemäluväärtusi, mis kajastavad kogu alampuu omadusi. Näiteks antud alampuu müügimaht. Iga hetk võime saada figuuri, mis peegeldab mis tahes haru saavutusi.

Globaalid on andmete salvestamiseks mõeldud aardemõõgad. puud. 2. osa

4. Millistel juhtudel on kõige kasulikum kasutada globaale?

Esimeses veerus on toodud juhtumid, kus globaalsete väärtuste kasutamisega saavutatakse märkimisväärne kiiruse suurenemine, ja teises veerus, kus disaini või andmemudelit lihtsustatakse.

Kiirus
Andmete töötlemise/esitlemise lihtsus

  1. Sisestamine [automaatse sorteerimisega igal tasemel], [indekseerimine põhivõtmega]
  2. Alampuude eemaldamine
  3. Objektid, millel on palju pesastatud omadusi, mis nõuavad individuaalset juurdepääsu
  4. Hierarhiline struktuur, mis võimaldab mööduda alamharudest mis tahes, isegi olematutest harudest
  5. Alampuude sügavus-esimene läbimine
  1. Objektid/olemid suure hulga valikuliste [ja/või pesastatud] atribuutidega/olemitega
  2. Skeemita andmed. Kui sageli võivad tekkida uued omadused ja vanad kaovad.
  3. Peate looma kohandatud andmebaasi.
  4. Teede alused ja otsustuspuud. Millal on mugav kujutada radu puuna.
  5. Hierarhiliste struktuuride eemaldamine ilma rekursiooni kasutamata

Laiendamine „Globalid on andmete salvestamise aaremõõgad. Hõredad massiivid. 3. osa".

Kaebused: See artikkel ja minu kommentaarid sellele on minu arvamus ega ole seotud InterSystems Corporationi ametliku seisukohaga.

Allikas: www.habr.com

Lisa kommentaar