Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2Početak - pogledajte dio 1.

3. Varijante struktura pri korištenju globala

Struktura kao što je uređeno stablo ima različite posebne slučajeve. Razmotrimo one koji imaju praktičnu vrijednost u radu sa globalima.

3.1 Poseban slučaj 1. Jedan čvor bez grana


Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2Globalne vrednosti se mogu koristiti ne samo kao niz, već i kao regularne varijable. Na primjer, kao brojač:

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

U ovom slučaju, global, osim svog značenja, može imati i grane. Jedno ne isključuje drugo.

3.2 Poseban slučaj 2. Jedan vrh i mnogo grana

Općenito, ovo je klasična baza ključ/vrijednost. A ako sačuvamo niz vrijednosti kao vrijednost, dobićemo sasvim običnu tabelu sa primarnim ključem.

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2

Da bismo implementirali tablicu na globalne vrijednosti, morat ćemo sami generirati redove iz vrijednosti stupaca, a zatim ih sačuvati u globalu koristeći primarni ključ. Da biste omogućili ponovno podjelu niza na stupce prilikom čitanja, možete koristiti:

  1. znakovi za razdvajanje.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. kruta shema u kojoj svako polje zauzima unaprijed određen broj bajtova. Kao što se radi u relacionim bazama podataka.
  3. specijalna funkcija $LB (dostupna u Cache), koja kreira niz vrijednosti.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Zanimljivo je da nije teško koristiti globale da bi se uradilo nešto slično sekundarnim indeksima u relacionim bazama podataka. Nazovimo takve strukture indeksnim globalima. Globalni indeks je pomoćno stablo za brzo pretraživanje polja koja nisu dio primarnog ključa glavnog globala. Da biste ga popunili i koristili, morate napisati dodatni kod.

Kreirajmo globalni indeks na prvoj koloni.

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

Sada, da bismo brzo tražili informacije u prvoj koloni, moramo pogledati globalno ^i i pronađite primarne ključeve (id) koji odgovaraju željenoj vrijednosti prve kolone.

Prilikom umetanja vrijednosti, možemo odmah kreirati globalne vrijednosti i indeksa za potrebna polja. A radi pouzdanosti, hajde da sve to umotamo u transakciju.

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

Detalji o tome kako to učiniti na M tabele o globalima, emulacija sekundarnih indeksa.

Takve tabele će raditi jednako brzo kao u tradicionalnim bazama podataka (ili čak brže) ako su funkcije za umetanje/ažuriranje/brisanje redova napisane u COS/M i kompajlirane.Provjerio sam ovu naredbu pomoću testova na masovnom INSERT i SELECT u jednu tabelu s dvije kolone, uključujući korištenje naredbi TSTART i TCOMMIT (transakcije).

Nisam testirao složenije scenarije sa istovremenim pristupom i paralelnim transakcijama.

Bez korišćenja transakcija, stopa umetanja je bila 778 umetanje u sekundi na milion vrednosti.
Sa 300 miliona vrijednosti - 422 umetanje u sekundi.

Kada koristite transakcije - 572 umetanja/sekundi za 082M umetanja. Sve operacije su izvedene iz kompajliranog M koda.
Hard diskovi su obični, ne SSD. RAID5 sa povratnim upisom. Phenom II 1100T procesor.

Da biste testirali SQL bazu podataka na sličan način, morate napisati pohranjenu proceduru koja će izvoditi umetanja u petlji. Prilikom testiranja MySQL 5.5 (InnoDB skladište), koristeći ovu metodu, dobio sam brojeve ne više od 11K umetanja u sekundi.
Da, implementacija tabela na globalima izgleda složenije nego u relacionim bazama podataka. Stoga industrijske baze podataka na globalima imaju SQL pristup za pojednostavljenje rada sa tabelarnim podacima.

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2Općenito, ako se šema podataka neće često mijenjati, brzina umetanja nije kritična i cijela baza podataka se može lako predstaviti u obliku normaliziranih tablica, onda je lakše raditi sa SQL-om, jer pruža viši nivo apstrakcije .

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2U ovom konkretnom slučaju to sam htio pokazati globals može djelovati kao konstruktor za kreiranje drugih baza podataka. Kao asembler u kojem se mogu pisati drugi jezici. Evo primjera kako možete kreirati analoge na globalima ključ/vrijednost, liste, skupovi, tabelarne, dokumentno orijentisane baze podataka.

Ako trebate da napravite neku vrstu nestandardne baze podataka uz minimalan napor, onda biste trebali gledati prema globalima.

3.3 Poseban slučaj 3. Stablo na dva nivoa, svaki čvor drugog nivoa ima fiksni broj grana

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2Verovatno ste pogodili: ovo je alternativna implementacija tabela na globalima. Uporedimo ovu implementaciju sa prethodnom.

Tablice na stablu na dva nivoa vs. na jednoslojnom drvetu.

Minusy
Plûsy

  1. Sporije za umetanje, jer morate postaviti broj čvorova jednak broju kolona.
  2. Veća potrošnja prostora na disku. Pošto globalni indeksi (shvaćeni kao indeksi niza) sa imenima kolona zauzimaju prostor na disku i dupliraju se za svaki red.

  1. Brži pristup vrijednostima pojedinačnih kolona, ​​jer nema potrebe za raščlanjivanjem stringa. Prema mojim testovima, 11,5% je brži na 2 kolone i više na većem broju kolona.
  2. Lakše je promijeniti šemu podataka
  3. Jasniji kod

Zaključak: nije za svakoga. Budući da je brzina jedna od najvažnijih prednosti globala, nema smisla koristiti ovu implementaciju, jer najvjerovatnije neće raditi brže od tabela u relacijskim bazama podataka.

3.4 Opšti slučaj. Drveće i naručena stabla

Bilo koja struktura podataka koja se može predstaviti kao stablo savršeno se uklapa sa globalima.

3.4.1 Objekti sa podobjektima

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2

Ovo je područje tradicionalne upotrebe globala. U oblasti medicine postoji ogroman broj bolesti, lijekova, simptoma i metoda liječenja. Neracionalno je kreirati tabelu sa milion polja za svakog pacijenta. Štaviše, 99% polja će biti prazno.

Zamislite SQL bazu podataka tabela: "pacijent" ~ 100 polja, "Medicina" - 000 polja, "Terapija" - 100 polja, "Komplikacije" - 000 polja, itd. i tako dalje. Ili možete kreirati bazu podataka od mnogo hiljada tabela, svaka za određenu vrstu pacijenata (i mogu se preklapati!), tretmana, lijekova i još hiljada tabela za veze između ovih tabela.

Globali su idealni za medicinu, jer vam omogućavaju da za svakog pacijenta kreirate tačan opis njegove medicinske istorije, različitih terapija i delovanja lekova, u obliku drveta, bez trošenja dodatnog prostora na disku na prazne kolone, kao što bi biti slučaj u relacionom slučaju.

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2Koristeći globale zgodno je kreirati bazu podataka sa podacima o ljudima, kada je važno akumulirati i sistematizovati maksimalno raznovrsne informacije o klijentu. Ovo je traženo u medicini, bankarstvu, marketingu, arhivi i drugim oblastima

.
Naravno, u SQL-u takođe možete emulirati stablo sa samo nekoliko tabela (EAV, 1,2,3,4,5,6,7,8,9,10), međutim ovo je znatno složenije i bit će sporije. U suštini, morali biste da napišete globalno rešenje koje radi na tabelama i sakrijete sav rad sa tabelama pod slojem apstrakcije. Pogrešno je oponašati tehnologiju nižeg nivoa (globali) koristeći tehnologiju višeg nivoa (SQL). Neprikladno.

Nije tajna da promjena šeme podataka na ogromnim tablicama (ALTER TABLE) može potrajati dosta vremena. MySQL, na primjer, radi ALTER TABLE ADD|DROP COLUMN tako što potpuno kopira informacije iz stare tablice u novu tablicu (testirani MyISAM, InnoDB motori). Koja može danima, ako ne i nedeljama, okači radnu bazu podataka sa milijardama zapisa.

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2Promjena strukture podataka ako koristimo globalne vrijednosti nas ništa ne košta. U svakom trenutku možemo dodati bilo koja nova svojstva koja su nam potrebna bilo kojem objektu, na bilo kojem nivou hijerarhije. Promjene povezane s preimenovanjem grana mogu se izvoditi u pozadini na pokrenutoj bazi podataka.


Stoga, kada je u pitanju pohranjivanje objekata s ogromnim brojem opcionih svojstava, globalni su odličan izbor.

Štaviše, da vas podsetim da je pristup bilo kom svojstvu trenutan, pošto su u globalu sve staze B-stabla.

Globalne baze podataka, općenito, su tip dokumenata orijentirane baze podataka sa mogućnošću pohranjivanja hijerarhijskih informacija. Stoga, dokumentno orijentisane baze podataka mogu se takmičiti sa globalima u oblasti skladištenja medicinske dokumentacije. Ali još uvijek nije sasvim istoUzmimo MongoDB za poređenje. U ovoj domeni gubi od globalnih iz sledećih razloga:

  1. Veličina dokumenta. Jedinica za skladištenje je tekst u JSON formatu (tačnije BSON) sa maksimalnom zapreminom od oko 16MB. Ograničenje je napravljeno posebno da se JSON baza podataka ne uspori tokom raščlanjivanja ako je u njoj pohranjen veliki JSON dokument i zatim joj se pristupa putem polja. Ovaj dokument treba da sadrži sve podatke o pacijentu. Svi znamo koliko debeli kartoni pacijenata mogu biti. Maksimalna veličina kartice od 16MB odmah stavlja tačku na pacijente čija kartica bolesti uključuje MRI datoteke, rendgenske snimke i druge studije. U jednoj grani globalnog možete imati gigabajte i terabajte informacija. U principu, možemo tome stati na kraj, ali ja ću nastaviti.
  2. Vrijeme svijesti/promjene/brisanja novih svojstava u karti pacijenta. Takva baza podataka mora pročitati cijelu mapu u memoriju (ovo je velika količina!), analizirati BSON, dodati/promijeniti/obrisati novi čvor, ažurirati indekse, spakovati je u BSON i spremiti na disk. Global samo treba da pristupi određenom svojstvu i njime manipuliše.
  3. Brz pristup pojedinačnim nekretninama. Uz mnogo svojstava u dokumentu i njegovu strukturu na više nivoa, pristup pojedinačnim svojstvima će biti brži zbog činjenice da je svaka putanja u globalu B-stablo. U BSON-u morate linearno analizirati dokument da biste pronašli željeno svojstvo.

3.3.2 Asocijativni nizovi

Asocijativni nizovi (čak i sa ugniježđenim nizovima) savršeno se uklapaju u globale. Na primjer, takav niz iz PHP-a će biti prikazan na prvoj slici 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 Hijerarhijski dokumenti: XML, JSON

Također se lako skladišti u globalima. Može se rasporediti na različite načine za skladištenje.

XML
Najlakši način za razlaganje XML-a na globalne je pohranjivanje atributa oznaka u čvorove. A ako je potreban brz pristup atributima oznaka, onda ih možemo premjestiti u zasebne grane.

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2

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

Na COS-u bi to odgovaralo kodu:

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

Komentar: Za XML, JSON, asocijativne nizove, možete smisliti mnogo različitih načina prikaza na globalima. U ovom slučaju, nismo odrazili redoslijed podoznaka u oznaci bilješke. Globalno ^xml podoznake će biti prikazane po abecednom redu. Da striktno odražavate redoslijed, možete koristiti, na primjer, sljedeći prikaz:

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2
JSON.
Prva slika iz odjeljka 3.3.1 prikazuje odraz ovog JSON dokumenta:

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

3.3.4 Identične strukture povezane hijerarhijskim odnosima

Primjeri: struktura prodajnih ureda, lokacija ljudi u MLM strukturi, baza podataka otvaranja u šahu.

Baza podataka debitanata. Možete koristiti procjenu sile udarca kao vrijednost indeksa globalnog čvora. Tada će za odabir najjačeg poteza biti dovoljno odabrati granu s najvećom težinom. U globalu, sve grane na svakom nivou će biti sortirane prema snazi ​​kretanja.

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2

Struktura prodajnih ureda, struktura ljudi u MLM-u. Čvorovi mogu pohraniti određene vrijednosti keširanja koje odražavaju karakteristike cijelog podstabla. Na primjer, obim prodaje datog podstabla. U svakom trenutku možemo dobiti cifru koja odražava dostignuća bilo koje grane.

Globalni su mačevi blaga za pohranjivanje podataka. Drveće. Dio 2

4. U kojim slučajevima je najkorisnije koristiti globale?

Prva kolona predstavlja slučajeve u kojima ćete dobiti značajno povećanje brzine korištenjem globala, a druga kada će dizajn ili model podataka biti pojednostavljeni.

Brzina
Jednostavnost obrade/prezentacije podataka

  1. Umetanje [sa automatskim sortiranjem na svakom nivou], [indeksiranje po glavnom ključu]
  2. Uklanjanje podstabala
  3. Objekti s puno ugniježđenih svojstava koja zahtijevaju individualni pristup
  4. Hijerarhijska struktura sa mogućnošću zaobilaženja podređenih grana iz bilo koje grane, čak i one nepostojeće
  5. Prelazak podstabala u dubinu
  1. Objekti/entiteti sa ogromnim brojem opcionih [i/ili ugniježđenih] svojstava/entiteta
  2. Podaci bez šeme. Kada se nova svojstva često mogu pojaviti, a stara nestati.
  3. Morate kreirati prilagođenu bazu podataka.
  4. Baze putanja i stabla odlučivanja. Kada je zgodno predstaviti staze kao stablo.
  5. Uklanjanje hijerarhijskih struktura bez upotrebe rekurzije

Nastavak “Globali su mačevi blaga za pohranjivanje podataka. Retki nizovi. dio 3".

odricanje: Ovaj članak i moji komentari na njega su moje mišljenje i nemaju nikakve veze sa zvaničnim stavom InterSystems Corporation.

izvor: www.habr.com

Dodajte komentar