Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. del

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. delKako začeti – glejte 1. del.

3. Različice struktur pri uporabi globalov

Struktura, kot je urejeno drevo, ima različne posebne primere. Razmislimo o tistih, ki imajo praktično vrednost pri delu z globali.

3.1 Poseben primer 1. Eno vozlišče brez vej


Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. delGlobalne vrednosti se lahko uporabljajo ne samo kot matrike, ampak tudi kot običajne spremenljivke. Na primer, kot števec:

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

V tem primeru ima lahko global poleg pomena tudi veje. Eno ne izključuje drugega.

3.2 Poseben primer 2. Eno oglišče in veliko vej

Na splošno je to klasična baza ključ-vrednost. In če shranimo tulp vrednosti kot vrednost, bomo dobili zelo običajno tabelo s primarnim ključem.

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. del

Za implementacijo tabele na globalih bomo morali sami ustvariti vrstice iz vrednosti stolpcev in jih nato shraniti v global s pomočjo primarnega ključa. Če želite pri branju ponovno razdeliti niz v stolpce, lahko uporabite:

  1. ločilne znake.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. togo shemo, v kateri vsako polje zaseda vnaprej določeno število bajtov. Kot je storjeno v relacijskih bazah podatkov.
  3. posebno funkcijo $LB (na voljo v predpomnilniku), ki ustvari niz vrednosti.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Zanimivo je, da z globali ni težko narediti nekaj podobnega sekundarnim indeksom v relacijskih bazah podatkov. Takšne strukture imenujemo indeksni globali. Indeksni global je pomožno drevo za hitro iskanje polj, ki niso del primarnega ključa glavnega globala. Če ga želite izpolniti in uporabiti, morate napisati dodatno kodo.

Ustvarimo globalni indeks v prvem stolpcu.

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

Za hitro iskanje informacij v prvem stolpcu moramo zdaj pogledati v global ^i in poiščite primarne ključe (id), ki ustrezajo želeni vrednosti prvega stolpca.

Ko vstavimo vrednost, lahko takoj ustvarimo tako vrednost kot globalne indekse za zahtevana polja. In zaradi zanesljivosti zavijmo vse v transakcijo.

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

Podrobnosti o tem, kako to storiti na M tabele na globalih, emulacija sekundarnih indeksov.

Takšne tabele bodo delovale tako hitro kot v tradicionalnih zbirkah podatkov (ali celo hitreje), če so funkcije za vstavljanje/posodabljanje/brisanje vrstic napisane v COS/M in prevedene.To izjavo sem preveril s testi množičnih INSERT in SELECT v eno tabelo z dvema stolpcema, vključno z uporabo ukazov TSTART in TCOMMIT (transakcije).

Nisem testiral bolj zapletenih scenarijev s sočasnim dostopom in vzporednimi transakcijami.

Brez uporabe transakcij je bila stopnja vstavljanja 778 vstavkov/sekundo na milijon vrednosti.
S 300 milijoni vrednosti - 422 vstavkov/sekundo.

Pri uporabi transakcij - 572 vstavkov/sekundo za 082M vstavkov. Vse operacije so bile izvedene iz prevedene kode M.
Trdi diski so običajni, ne SSD. RAID5 s povratnim zapisovanjem. Procesor Phenom II 1100T.

Če želite preizkusiti bazo podatkov SQL na podoben način, morate napisati shranjeno proceduro, ki bo izvajala vstavljanja v zanki. Pri testiranju MySQL 5.5 (shramba InnoDB) sem s to metodo prejel številke, ki niso bile več kot 11K vstavkov na sekundo.
Da, implementacija tabel na globalih je videti bolj zapletena kot v relacijskih bazah podatkov. Zato imajo industrijske baze podatkov o globalih dostop SQL za poenostavitev dela s tabelarnimi podatki.

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. delNa splošno velja, da če se podatkovna shema ne bo pogosto spreminjala, hitrost vstavljanja ni kritična in je celotno zbirko podatkov mogoče enostavno predstaviti v obliki normaliziranih tabel, potem je lažje delati s SQL, saj zagotavlja višjo raven abstrakcije .

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. delV tem konkretnem primeru sem želel to pokazati globali lahko delujejo kot konstruktor za ustvarjanje drugih baz podatkov. Kot asembler, v katerem je mogoče pisati druge jezike. Tukaj so primeri, kako lahko ustvarite analoge na globalih ključ-vrednost, seznami, nizi, tabelarične, dokumentno orientirane baze podatkov.

Če morate z minimalnim naporom ustvariti nekakšno nestandardno zbirko podatkov, se obrnite na globalne.

3.3 Poseben primer 3. Dvonivojsko drevo, vsako vozlišče druge ravni ima fiksno število vej

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. delVerjetno ste uganili: to je alternativna implementacija tabel na globalih. Primerjajmo to izvedbo s prejšnjo.

Tabele na dvonivojskem drevesu vs. na enonivojskem drevesu.

Proti
Pros

  1. Počasnejši za vstavljanje, saj morate nastaviti število vozlišč enako številu stolpcev.
  2. Večja poraba prostora na disku. Ker globalni indeksi (razumljeni kot matrični indeksi) z imeni stolpcev zasedejo prostor na disku in se podvojijo za vsako vrstico.

  1. Hitrejši dostop do vrednosti posameznih stolpcev, saj ni potrebe po razčlenjevanju niza. Po mojih testih je 11,5% hitrejši na 2 stolpcih in več na večjem številu stolpcev.
  2. Lažje spreminjanje podatkovne sheme
  3. Bolj jasna koda

Zaključek: ni za vsakogar. Ker je hitrost ena najpomembnejših prednosti globalov, uporaba te izvedbe nima smisla, saj najverjetneje ne bo delovala hitreje kot tabele v relacijskih zbirkah podatkov.

3.4 Splošni primer. Drevesa in naročena drevesa

Vsaka podatkovna struktura, ki jo je mogoče predstaviti kot drevo, se popolnoma ujema z globali.

3.4.1 Objekti s podobjekti

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. del

To je področje tradicionalne uporabe globalov. Na medicinskem področju je ogromno bolezni, zdravil, simptomov in metod zdravljenja. Neracionalno je ustvariti tabelo z milijoni polj za vsakega bolnika. Poleg tega bo 99 % polj praznih.

Predstavljajte si bazo podatkov SQL s tabelami: »pacient« ~ 100 polj, »Zdravilo« - 000 polj, »Terapija« - 100 polj, »Zapleti« - 000 polj itd. in tako naprej. Lahko pa ustvarite zbirko podatkov s tisoči tabel, vsako za določeno vrsto bolnika (in lahko se prekrivajo!), zdravljenja, zdravila in več tisoč drugih tabel za povezave med temi tabelami.

Globali so idealni za medicino, saj vam omogočajo, da za vsakega bolnika ustvarite natančen opis njegove anamneze, različnih terapij in delovanja zdravil v obliki drevesa, ne da bi zapravljali dodaten prostor na disku za prazne stolpce, kot bi naj bo tako v relacijskem primeru.

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. delZ uporabo globalov je priročno ustvariti bazo podatkov s podatki o ljudeh, ko je pomembno zbrati in sistematizirati največ različnih informacij o stranki. Po tem povprašujejo v medicini, bančništvu, marketingu, arhivistiki in drugih področjih

.
Seveda lahko v SQL emulirate tudi drevo z le nekaj tabelami (EAV razširitev, 1,2,3,4,5,6,7,8,9,10), vendar je to bistveno bolj zapleteno in bo počasnejše. V bistvu bi morali napisati global, ki deluje na tabelah, in skriti vse delo s tabelami pod plastjo abstrakcije. Napačno je posnemati tehnologijo nižje ravni (globale) z uporabo tehnologije višje ravni (SQL). Neprimerno.

Ni skrivnost, da spreminjanje podatkovne sheme na velikanskih tabelah (ALTER TABLE) lahko traja precej časa. MySQL na primer naredi ALTER TABLE ADD|DROP COLUMN s popolnim kopiranjem informacij iz stare tabele v novo tabelo (preizkušeni motorji MyISAM, InnoDB). Kar lahko delujočo bazo podatkov z milijardami zapisov obesi za dneve, če ne tedne.

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. delSpreminjanje strukture podatkov, če uporabljamo globale, nas nič ne stane. Kadar koli lahko kateremu koli objektu na kateri koli ravni hierarhije dodamo poljubne nove lastnosti, ki jih potrebujemo. Spremembe, povezane s preimenovanjem vej, se lahko izvajajo v ozadju delujoče podatkovne baze.


Zato so globali odlična izbira, ko gre za shranjevanje objektov z ogromnim številom neobveznih lastnosti.

Poleg tega naj vas spomnim, da je dostop do katere koli lastnosti takojšen, saj so v globalu vse poti B-drevesa.

Globalne baze podatkov so na splošno vrsta dokumentno usmerjene baze podatkov z možnostjo shranjevanja hierarhičnih informacij. Zato lahko dokumentno orientirane baze podatkov tekmujejo z globalnimi na področju shranjevanja zdravstvenih kartotek. Ampak še vedno ni čisto istoZa primerjavo vzemimo MongoDB. V tej domeni izgubi proti globalnim iz naslednjih razlogov:

  1. Velikost dokumenta. Shranjevalna enota je besedilo v formatu JSON (natančneje BSON) z največjo prostornino približno 16 MB. Omejitev je bila narejena posebej zato, da se baza podatkov JSON med razčlenjevanjem ne upočasni, če je v njej shranjen ogromen dokument JSON in nato dostopan s pomočjo polj. Ta dokument mora vsebovati vse podatke o bolniku. Vsi vemo, kako debele so lahko kartoteke bolnikov. Največja velikost kartice 16 MB takoj naredi konec bolnikom, katerih kartica bolezni vključuje datoteke MRI, rentgenske posnetke in druge študije. V eni veji globala imate lahko gigabajte in terabajte informacij. Načeloma lahko temu naredimo konec, a jaz bom nadaljeval.
  2. Čas zavesti/sprememba/brisanje novih lastnosti v pacientovem kartonu. Takšna zbirka podatkov mora prebrati celoten zemljevid v pomnilnik (to je velika količina!), razčleniti BSON, dodati/spremeniti/izbrisati novo vozlišče, posodobiti indekse, ga zapakirati v BSON in shraniti na disk. Global mora samo dostopati do določene lastnosti in jo manipulirati.
  3. Hiter dostop do posameznih nepremičnin. Zaradi številnih lastnosti v dokumentu in njegove večnivojske strukture bo dostop do posameznih lastnosti hitrejši zaradi dejstva, da je vsaka pot v globalu B-drevo. V BSON morate linearno razčleniti dokument, da poiščete želeno lastnost.

3.3.2 Asociativni nizi

Asociativni nizi (tudi z ugnezdenimi nizi) se popolnoma prilegajo globalom. Na primer, tak niz iz PHP bo prikazan na prvi sliki 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 Hierarhični dokumenti: XML, JSON

Prav tako enostavno shranjen v globalih. Lahko se postavi na različne načine za shranjevanje.

XML
Najlažji način za razgradnjo XML v globale je shranjevanje atributov oznak v vozliščih. In če je potreben hiter dostop do atributov oznake, jih lahko premaknemo v ločene veje.

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. del

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

Na COS bi to ustrezalo kodi:

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

Opomba: Za XML, JSON, asociativne nize si lahko izmislite veliko različnih načinov prikaza na globalih. V tem primeru nismo odražali vrstnega reda podoznak v oznaki opombe. Globalno ^xml podoznake bodo prikazane po abecednem vrstnem redu. Če želite natančno odražati vrstni red, lahko uporabite na primer naslednji prikaz:

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. del
JSON.
Prva slika iz razdelka 3.3.1 prikazuje odsev tega dokumenta JSON:

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

3.3.4 Enake strukture, povezane s hierarhičnimi odnosi

Primeri: struktura prodajnih pisarn, lokacija ljudi v strukturi MLM, baza podatkov o otvoritvah v šahu.

Debuts baza podatkov. Oceno sile udarca lahko uporabite kot vrednost indeksa globalnega vozlišča. Nato bo za izbiro najmočnejše poteze dovolj, da izberete vejo z največjo težo. V globalu bodo vse veje na vsaki ravni razvrščene po moči premikanja.

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. del

Struktura prodajnih pisarn, struktura ljudi v MLM. Vozlišča lahko shranijo določene predpomnjene vrednosti, ki odražajo značilnosti celotnega poddrevesa. Na primer, obseg prodaje danega poddrevesa. V vsakem trenutku lahko dobimo številko, ki odraža dosežke katere koli panoge.

Globali so zakladni meči za shranjevanje podatkov. Drevesa. 2. del

4. V katerih primerih je najbolj koristna uporaba globalov?

V prvem stolpcu so predstavljeni primeri, ko boste z uporabo globalov znatno povečali hitrost, v drugem pa primere, ko bosta zasnova ali podatkovni model poenostavljena.

Hitro
Enostavnost obdelave/predstavitve podatkov

  1. Vstavljanje [s samodejnim razvrščanjem na vsaki ravni], [indeksiranje z glavnim ključem]
  2. Odstranjevanje poddreves
  3. Objekti z veliko ugnezdenimi lastnostmi, ki zahtevajo individualni dostop
  4. Hierarhična struktura z možnostjo obhoda podrejenih vej iz katere koli veje, tudi neobstoječe
  5. Prehod poddreves v globino
  1. Objekti/entitete z ogromnim številom neobveznih [in/ali ugnezdenih] lastnosti/entitet
  2. Podatki brez sheme. Ko se pogosto lahko pojavijo nove lastnosti in izginejo stare.
  3. Ustvariti morate bazo podatkov po meri.
  4. Osnove poti in odločitvena drevesa. Kdaj je priročno predstaviti poti kot drevo.
  5. Odstranjevanje hierarhičnih struktur brez uporabe rekurzije

Podaljšanje »Globali so zakladni meči za shranjevanje podatkov. Redki nizi. 3. del".

Zavrnitev odgovornosti: Ta članek in moji komentarji nanj so moje mnenje in nimajo nobene zveze z uradnim stališčem InterSystems Corporation.

Vir: www.habr.com

Dodaj komentar