Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalis

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalisDarbo pradžia – žr. 1 dalį.

3. Struktūrų variantai naudojant globalius

Tokia struktūra kaip sutvarkytas medis turi įvairių specialių atvejų. Panagrinėkime tuos, kurie turi praktinę vertę dirbant su globaliais.

3.1 Ypatingas atvejis 1. Vienas mazgas be šakų


Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalisGlobalūs gali būti naudojami ne tik kaip masyvas, bet ir kaip įprasti kintamieji. Pavyzdžiui, kaip skaitiklis:

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

Šiuo atveju globalus, be savo prasmės, gali turėti ir šakų. Vienas neatmeta kito.

3.2 Ypatingas atvejis 2. Viena viršūnė ir daug šakų

Apskritai tai yra klasikinė rakto vertės bazė. Ir jei išsaugosime reikšmių eilutę kaip vertę, gausime labai įprastą lentelę su pirminiu raktu.

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalis

Norėdami įdiegti globalių lentelę, turėsime patys sugeneruoti eilutes iš stulpelių reikšmių, o tada išsaugoti jas visuotinėje, naudodami pirminį raktą. Kad skaitydami eilutę vėl būtų galima padalyti į stulpelius, galite naudoti:

  1. skiriamieji simboliai.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. standi schema, kurioje kiekvienas laukas užima iš anksto nustatytą baitų skaičių. Kaip daroma reliacinėse duomenų bazėse.
  3. speciali funkcija $LB (galima talpykloje), kuri sukuria reikšmių eilutę.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Įdomu tai, kad naudojant globalus nėra sunku padaryti kažką panašaus į antrinius indeksus reliacinėse duomenų bazėse. Pavadinkime tokias indeksų struktūras globaliais. Visuotinis indeksas yra pagalbinis medis, skirtas greitai ieškoti laukų, kurie nėra pagrindinio globalaus pirminio rakto dalis. Norėdami jį užpildyti ir naudoti, turite parašyti papildomą kodą.

Pirmajame stulpelyje sukurkime visuotinį indeksą.

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

Dabar, norėdami greitai ieškoti informacijos pirmajame stulpelyje, turime pažvelgti į pasaulinį ^i ir suraskite pirminius raktus (id), atitinkančius norimą pirmojo stulpelio reikšmę.

Įterpdami reikšmę galime iš karto sukurti ir reikšmės, ir indekso globalius reikiamiems laukams. O dėl patikimumo viską suvyniokime į sandorį.

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

Išsamią informaciją apie tai, kaip tai padaryti M lentelės apie globalius, antrinių indeksų emuliacija.

Tokios lentelės veiks taip pat greitai, kaip ir tradicinėse duomenų bazėse (ar net greičiau), jei eilučių įterpimo/atnaujinimo/naikinimo funkcijos bus parašytos COS/M ir sukompiliuotos.Šį teiginį patikrinau atlikdamas masinio INSERT ir SELECT testus į vieną dviejų stulpelių lentelę, įskaitant TSTART ir TCOMMIT komandas (operacijas).

Neišbandžiau sudėtingesnių scenarijų su lygiagrečia prieiga ir lygiagrečiomis operacijomis.

Nenaudojant operacijų, įterpimo greitis buvo 778 361 įterpimas per sekundę milijonui verčių.
Su 300 milijonų verčių - 422 141 įdėkla per sekundę.

Naudojant sandorius - 572 082 intarpai/sek už 50M intarpus. Visos operacijos buvo atliktos iš sukompiliuoto M kodo.
Kietieji diskai yra įprasti, o ne SSD. RAID5 su atrašymu. Phenom II 1100T procesorius.

Norėdami išbandyti SQL duomenų bazę panašiu būdu, turite parašyti saugomą procedūrą, kuri atliks įterpimus cikle. Bandydamas MySQL 5.5 (InnoDB saugykla), naudodamas šį metodą gavau skaičius ne daugiau kaip 11 XNUMX įterpimų per sekundę.
Taip, lentelių diegimas globaliuose atrodo sudėtingesnis nei reliacinėse duomenų bazėse. Todėl pramoninės globalių duomenų bazės turi SQL prieigą, kad būtų supaprastintas darbas su lentelės duomenimis.

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalisApskritai, jei duomenų schema nesikeis dažnai, įterpimo greitis nėra kritinis ir visa duomenų bazė gali būti lengvai pavaizduota normalizuotų lentelių pavidalu, tada lengviau dirbti su SQL, nes ji suteikia aukštesnį abstrakcijos lygį .

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalisŠiuo konkrečiu atveju norėjau tai parodyti globals gali veikti kaip konstruktorius kuriant kitas duomenų bazes. Kaip surinkėjas, kuriuo galima rašyti kitomis kalbomis. Štai pavyzdžiai, kaip galite sukurti analogus globaliuose įrenginiuose rakto reikšmė, sąrašai, rinkiniai, lentelės, į dokumentus orientuotos duomenų bazės.

Jei reikia minimaliomis pastangomis sukurti kokią nors nestandartinę duomenų bazę, tuomet reikėtų žiūrėti į globalius.

3.3 Ypatingas atvejis 3. Dviejų lygių medis, kiekvienas antrojo lygio mazgas turi fiksuotą skaičių šakų

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalisTikriausiai atspėjote: tai alternatyvus lentelių diegimas globaliuose įrenginiuose. Palyginkime šį įgyvendinimą su ankstesniu.

Lentelės ant dviejų lygių medžio vs. ant vieno lygio medžio.

Trūkumai
Argumentai "už"

  1. Lėtesnis įterpimas, nes reikia nustatyti mazgų skaičių, lygų stulpelių skaičiui.
  2. Didesnis disko vietos suvartojimas. Kadangi pasauliniai indeksai (suprantami kaip masyvo indeksai) su stulpelių pavadinimais užima vietos diske ir yra dubliuojami kiekvienoje eilutėje.

  1. Greitesnė prieiga prie atskirų stulpelių verčių, nes nereikia analizuoti eilutės. Remiantis mano bandymais, jis yra 11,5% greitesnis ant 2 stulpelių ir daugiau ant didesnio skaičiaus stulpelių.
  2. Lengviau keisti duomenų schemą
  3. Aiškesnis kodas

Išvada: ne visiems. Kadangi greitis yra vienas iš svarbiausių globalių pranašumų, nėra prasmės naudoti šį diegimą, nes greičiausiai jis veiks ne greičiau nei lentelės reliacinėse duomenų bazėse.

3.4 Bendras atvejis. Medžiai ir užsakyti medžiai

Bet kokia duomenų struktūra, kurią galima pavaizduoti kaip medį, puikiai dera su globaliais.

3.4.1 Objektai su poobjektais

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalis

Tai tradicinio globalių naudojimo sritis. Medicinos srityje yra daugybė ligų, vaistų, simptomų ir gydymo metodų. Neracionalu kiekvienam pacientui sukurti lentelę su milijonu laukų. Be to, 99% laukų bus tušti.

Įsivaizduokite SQL lentelių duomenų bazę: „pacientas“ ~ 100 000 laukų, „Medicina“ – 100 000 laukų, „Terapija“ – 100 000 laukų, „Komplikacijos“ – 100 000 laukų ir t.t. ir taip toliau. Arba galite sukurti daugelio tūkstančių lentelių duomenų bazę, kiekviena skirta tam tikram pacientų tipui (ir jos gali sutapti!), gydymo metodų, vaistų ir dar tūkstančių lentelių, skirtų jungtims tarp šių lentelių.

Globaliai idealiai tinka medicinai, nes leidžia kiekvienam pacientui sukurti tikslų jo ligos istorijos, įvairių terapijų ir vaistų veikimo aprašymą medžio pavidalu, neeikvodami papildomos vietos diske ant tuščių stulpelių. taip būti santykiniu atveju.

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalisNaudojant globalius patogu kurti duomenų bazę su duomenimis apie žmones, kai svarbu sukaupti ir susisteminti maksimaliai įvairios informacijos apie klientą. Tai yra paklausa medicinos, bankininkystės, rinkodaros, archyvavimo ir kitose srityse

.
Žinoma, SQL taip pat galite emuliuoti medį tik su keliomis lentelėmis (EAV plėtinys, 1,2,3,4,5,6,7,8,9,10), tačiau tai daug sudėtingiau ir bus lėtesnė. Iš esmės jūs turėtumėte parašyti globalų, kuris veikia lentelėse, ir paslėpti visą darbą su lentelėmis po abstrakcijos sluoksniu. Neteisinga mėgdžioti žemesnio lygio technologijas (globalus), naudojant aukštesnio lygio technologiją (SQL). Netinkama.

Ne paslaptis, kad duomenų schemos keitimas milžiniškose lentelėse (ALTER TABLE) gali užtrukti nemažai laiko. Pavyzdžiui, MySQL ALTER TABLE ADD | Drop COLUMN visiškai nukopijuoja informaciją iš senos lentelės į naują lentelę (išbandyti MyISAM, InnoDB varikliai). Kuris gali pakabinti veikiančią duomenų bazę su milijardais įrašų dienomis, jei ne savaitėmis.

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalisDuomenų struktūros keitimas, jei naudojame globalius duomenis, mums nieko nekainuoja. Bet kuriuo metu galime pridėti bet kokių naujų savybių, kurių mums reikia bet kuriame objekte, bet kuriame hierarchijos lygyje. Pakeitimai, susiję su šakų pervadinimu, gali būti vykdomi veikiančios duomenų bazės fone.


Todėl, kai reikia saugoti objektus su daugybe pasirenkamų savybių, globaliai yra puikus pasirinkimas.

Be to, leiskite jums priminti, kad prieiga prie bet kurios nuosavybės yra akimirksniu, nes pasaulyje visi keliai yra B medžiai.

Pasaulinės duomenų bazės apskritai yra į dokumentus orientuotos duomenų bazės, turinčios galimybę saugoti hierarchinę informaciją. Todėl į dokumentus orientuotos duomenų bazės gali konkuruoti su globaliais medicininių įrašų saugojimo srityje. Bet tai vis tiek nėra visiškai tas patsPalyginimui paimkime MongoDB. Šiame domene ji pralaimi pasauliams dėl šių priežasčių:

  1. Dokumento dydis. Saugojimo blokas yra tekstas JSON formatu (tiksliau BSON), kurio didžiausias tūris yra apie 16 MB. Apribojimas buvo sukurtas specialiai tam, kad JSON duomenų bazė nesulėtėtų analizuojant, jei joje saugomas didžiulis JSON dokumentas, o vėliau pasiekiamas laukais. Šiame dokumente turi būti visa informacija apie pacientą. Visi žinome, kokie stori gali būti pacientų įrašai. Maksimalus 16 MB kortelės dydis iš karto atkerta kelią pacientams, kurių ligos kortelėje yra MRT failai, rentgeno skenavimas ir kiti tyrimai. Vienoje pasaulio šakoje galite turėti gigabaitų ir terabaitų informacijos. Iš esmės galime tai padaryti, bet aš tęsiu.
  2. Sąmonės/naujų savybių pasikeitimo/ištrynimo laikas paciento diagramoje. Tokia duomenų bazė turi perskaityti visą žemėlapį į atmintį (tai didelis kiekis!), išanalizuoti BSON, pridėti/pakeisti/ištrinti naują mazgą, atnaujinti indeksus, supakuoti į BSON ir įrašyti į diską. Pasauliui tereikia pasiekti konkrečią nuosavybę ir ja manipuliuoti.
  3. Greita prieiga prie atskirų objektų. Kadangi dokumente yra daug ypatybių ir daugiapakopė struktūra, prieiga prie atskirų ypatybių bus greitesnė dėl to, kad kiekvienas kelias globaliame pasaulyje yra B medis. BSON turite tiesiškai išanalizuoti dokumentą, kad rastumėte norimą ypatybę.

3.3.2 Asociatyviniai masyvai

Asociatyvūs masyvai (net su įdėtais masyvais) puikiai tinka globaliems masyvams. Pavyzdžiui, toks masyvas iš PHP bus rodomas pirmame paveikslėlyje 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 Hierarchiniai dokumentai: XML, JSON

Taip pat lengvai saugomas globaliuose. Galima išdėstyti įvairiais saugojimo būdais.

XML
Lengviausias būdas išanalizuoti XML į globalius yra saugoti žymos atributus mazguose. Ir jei reikia greitos prieigos prie žymos atributų, galime juos perkelti į atskiras šakas.

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalis

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

COS tai atitiktų kodą:

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

Pastaba: Jei naudojate XML, JSON, asociatyvinius masyvus, galite sugalvoti daugybę skirtingų rodymo būdų globaliuose formatuose. Šiuo atveju pastabos žymoje neatspindėjome antrinių žymų eilės. Pasauliniu mastu ^xml antrinės žymos bus rodomos abėcėlės tvarka. Norėdami tiksliai atspindėti užsakymą, galite naudoti, pavyzdžiui, šį ekraną:

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalis
JSONAS.
Pirmajame paveikslėlyje iš 3.3.1 skilties parodytas šio JSON dokumento atspindys:

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

3.3.4 Identiškos struktūros, sujungtos hierarchiniais ryšiais

Pavyzdžiai: pardavimo biurų struktūra, žmonių vieta MLM struktūroje, šachmatų angų duomenų bazė.

Debiutuoja duomenų bazė. Galite naudoti smūgio jėgos įvertinimą kaip pasaulinio mazgo indekso reikšmę. Tuomet, norint pasirinkti stipriausią judesį, pakaks pasirinkti didžiausio svorio šaką. Pasaulyje visos šakos kiekviename lygyje bus rūšiuojamos pagal judėjimo stiprumą.

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalis

Pardavimų biurų struktūra, žmonių struktūra MLM. Mazgai gali saugoti tam tikras talpyklos reikšmes, kurios atspindi viso pomedžio ypatybes. Pavyzdžiui, tam tikro pomedžio pardavimo apimtis. Bet kurią akimirką galime gauti figūrą, atspindinčią bet kurios šakos pasiekimus.

Globaliai yra lobis-kardai duomenims saugoti. medžiai. 2 dalis

4. Kokiais atvejais naudingiausia naudoti globalius?

Pirmajame stulpelyje pateikiami atvejai, kai gausite didelį greičio padidėjimą naudodami globalius, o antrame - kai dizainas ar duomenų modelis bus supaprastintas.

Pagreitinti
Duomenų apdorojimo/pateikimo paprastumas

  1. Įterpimas [su automatiniu rūšiavimu kiekviename lygyje], [indeksavimas pagal pagrindinį raktą]
  2. Pomedžių pašalinimas
  3. Objektai su daugybe įdėtų savybių, kurioms reikalinga individuali prieiga
  4. Hierarchinė struktūra su galimybe apeiti vaikų šakas iš bet kurios šakos, net ir neegzistuojančios
  5. Pomedžių perėjimas gyliu
  1. Objektai / subjektai su daugybe pasirenkamų [ir (arba) įdėtų] ypatybių / objektų
  2. Duomenys be schemų. Kai dažnai gali atsirasti naujų savybių, o senų išnykti.
  3. Turite sukurti pasirinktinę duomenų bazę.
  4. Kelio pagrindai ir sprendimų medžiai. Kai patogu takus vaizduoti kaip medį.
  5. Hierarchinių struktūrų pašalinimas nenaudojant rekursijos

Pratęsimas „Globalai yra lobis-kardai duomenims saugoti. Reti masyvai. 3 dalis".

Atsakomybės neigimas: Šis straipsnis ir mano komentarai yra mano nuomonė ir nesusiję su oficialia InterSystems Corporation pozicija.

Šaltinis: www.habr.com

Добавить комментарий