Globali su mačevi za pohranjivanje podataka. Drveće. 2. dio

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dioPočetak - pogledajte 1. dio.

3. Varijante struktura pri korištenju globala

Struktura kao što je uređeno stablo ima razne posebne slučajeve. Razmotrimo one koji imaju praktičnu vrijednost pri radu s globalima.

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


Globali su mačevi za pohranjivanje podataka. Drveće. 2. dioGlobali 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 ogranke. 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 spremimo tuple vrijednosti kao vrijednost, dobit ćemo vrlo običnu tablicu s primarnim ključem.

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dio

Da bismo implementirali tablicu na globalima, morat ćemo sami generirati retke iz vrijednosti stupaca, a zatim ih spremiti u global pomoću primarnog ključa. Da biste ponovo mogli podijeliti niz u stupce prilikom čitanja, možete koristiti:

  1. znakovi za razdvajanje.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. krutu shemu u kojoj svako polje zauzima unaprijed određeni broj bajtova. Kao što se radi u relacijskim bazama podataka.
  3. posebna funkcija $LB (dostupna u Cacheu), koja stvara niz vrijednosti.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Zanimljivo je da nije teško upotrijebiti globale za napraviti nešto slično sekundarnim indeksima u relacijskim bazama podataka. Nazovimo takve strukture globalima indeksa. Indeksni global je pomoćno stablo za brzo pretraživanje polja koja nisu dio primarnog ključa glavnog globala. Da biste ga ispunili i koristili, morate napisati dodatni kod.

Kreirajmo globalni indeks na prvom stupcu.

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

Sada, da bismo brzo pretražili informacije u prvom stupcu, moramo pogledati globalno ^i i pronađite primarne ključeve (id) koji odgovaraju željenoj vrijednosti prvog stupca.

Prilikom umetanja vrijednosti, možemo odmah stvoriti globalne vrijednosti i indekse za potrebna polja. A radi pouzdanosti, upakirajmo sve u transakciju.

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

Pojedinosti o tome kako to učiniti na M tablice na globalima, emulacija sekundarnih indeksa.

Takve će tablice raditi jednako brzo kao u tradicionalnim bazama podataka (ili čak brže) ako su funkcije za umetanje/ažuriranje/brisanje redaka napisane u COS/M i kompajlirane.Provjerio sam ovu izjavu testovima skupnog INSERT-a i SELECT-a u jednu tablicu s dva stupca, uključujući korištenje naredbi TSTART i TCOMMIT (transakcije).

Nisam testirao složenije scenarije s istodobnim pristupom i paralelnim transakcijama.

Bez korištenja transakcija, stopa umetanja bila je 778 umetanja/sekundi po milijunu vrijednosti.
S 300 milijuna vrijednosti - 422 umetanja/sekundi.

Pri korištenju transakcija - 572 umetanja/sekundi za 082M umetanja. Sve operacije izvedene su iz kompajliranog M koda.
Tvrdi diskovi su obični, a ne SSD. RAID5 s povratnim pisanjem. Procesor Phenom II 1100T.

Da biste testirali SQL bazu podataka na sličan način, trebate napisati pohranjenu proceduru koja će izvoditi umetanja u petlji. Prilikom testiranja MySQL 5.5 (InnoDB pohrana), koristeći ovu metodu, primio sam brojeve ne više od 11K umetanja u sekundi.
Da, implementacija tablica na globalima izgleda složenije nego u relacijskim bazama podataka. Stoga industrijske baze podataka na globalima imaju SQL pristup za pojednostavljenje rada s tabličnim podacima.

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dioOpćenito, ako se shema podataka neće često mijenjati, brzina umetanja nije kritična i cijela baza podataka može se lako predstaviti u obliku normaliziranih tablica, tada je lakše raditi sa SQL-om, budući da pruža višu razinu apstrakcije .

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dioU ovom konkretnom slučaju to sam htio pokazati globali mogu djelovati kao konstruktor za stvaranje drugih baza podataka. Kao asembler na kojem se mogu pisati drugi jezici. Ovdje su primjeri kako možete stvoriti analoge na globalima ključ-vrijednost, popisi, skupovi, tablične, dokumentno orijentirane baze podataka.

Ako trebate stvoriti neku vrstu nestandardne baze podataka uz minimalan napor, tada biste trebali gledati prema globalima.

3.3 Poseban slučaj 3. Stablo na dvije razine, svaki čvor druge razine ima fiksni broj grana

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dioVjerojatno ste pogodili: ovo je alternativna implementacija tablica na globalima. Usporedimo ovu implementaciju s prethodnom.

Tablice na dvorazinskom stablu vs. na jednoslojnom stablu.

Cons
Prozodija

  1. Sporije za umetanje, jer trebate postaviti broj čvorova jednak broju stupaca.
  2. Veća potrošnja prostora na disku. Budući da globalni indeksi (shvaćeni kao indeksi polja) s nazivima stupaca zauzimaju prostor na disku i dupliciraju se za svaki redak.

  1. Brži pristup vrijednostima pojedinačnih stupaca, budući da nema potrebe za raščlanjivanjem niza. Po mojim testovima je 11,5% brži na 2 kolone i više na većem broju kolona.
  2. Lakša promjena sheme 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, budući da najvjerojatnije neće raditi ništa brže od tablica u relacijskim bazama podataka.

3.4 Opći slučaj. Stabla i naručena stabla

Svaka struktura podataka koja se može predstaviti kao stablo savršeno pristaje globalima.

3.4.1 Objekti s podobjektima

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dio

Ovo je područje tradicionalne uporabe globala. U medicinskom području postoji ogroman broj bolesti, lijekova, simptoma i metoda liječenja. Neracionalno je za svakog pacijenta napraviti tablicu s milijun polja. Štoviše, 99% polja bit će prazno.

Zamislite SQL bazu podataka tablica: “pacijent” ~ 100 polja, “Medicina” - 000 polja, “Terapija” - 100 polja, “Komplikacije” - 000 polja, itd. i tako dalje. Ili možete stvoriti bazu podataka od mnogo tisuća tablica, svaka za određenu vrstu pacijenta (i mogu se preklapati!), tretmane, lijekove i još tisuće tablica za veze između ovih tablica.

Globali su idealni za medicinu jer vam omogućuju da za svakog pacijenta napravite točan opis njegove povijesti bolesti, raznih terapija i djelovanja lijekova, u obliku stabla, bez trošenja dodatnog diskovnog prostora na prazne stupce, kao što bi biti slučaj u relacijskom slučaju.

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dioKorištenjem globala prikladno je stvoriti bazu podataka s podacima o ljudima, kada je važno akumulirati i sistematizirati maksimum različitih informacija o klijentu. Ovo je traženo u medicini, bankarstvu, marketingu, arhiviranju i drugim područjima

.
Naravno, u SQL-u također možete emulirati stablo sa samo nekoliko tablica (EAV proširenje, 1,2,3,4,5,6,7,8,9,10), no to je znatno kompliciranije i bit će sporije. U biti, morali biste napisati global koji radi na tablicama i sakriti sav rad s tablicama ispod sloja apstrakcije. Pogrešno je oponašati tehnologiju niže razine (globale) pomoću tehnologije više razine (SQL). Neprikladno.

Nije tajna da promjena sheme podataka na ogromnim tablicama (ALTER TABLE) može potrajati prilično dugo. MySQL, na primjer, radi ALTER TABLE ADD|DROP COLUMN potpunim kopiranjem informacija iz stare tablice u novu tablicu (testirani MyISAM, InnoDB motori). Što može prekinuti radnu bazu podataka s milijardama zapisa danima, ako ne i tjednima.

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dioPromjena strukture podataka ako koristimo globale ništa nas ne košta. U bilo kojem trenutku možemo dodati nova svojstva koja su nam potrebna bilo kojem objektu, na bilo kojoj razini hijerarhije. Promjene povezane s preimenovanjem grana mogu se izvoditi u pozadini na pokrenutoj bazi podataka.


Stoga, kada se radi o pohranjivanju objekata s velikim brojem opcijskih svojstava, globali su odličan izbor.

Štoviše, dopustite mi da vas podsjetim da je pristup bilo kojem od svojstava trenutačni, budući da su u globalu sve staze B-stabla.

Globalne baze podataka općenito su vrsta baze podataka orijentirane na dokumente s mogućnošću pohranjivanja hijerarhijskih informacija. Stoga se baze podataka orijentirane na dokumente mogu natjecati s globalima u području pohranjivanja medicinske dokumentacije. Ali još uvijek nije sasvim istoUzmimo MongoDB za usporedbu. U ovoj domeni gubi od globalnih iz sljedećih razloga:

  1. Veličina dokumenta. Jedinica pohrane je tekst u JSON formatu (točnije BSON) maksimalnog volumena oko 16MB. Ograničenje je napravljeno posebno kako se JSON baza podataka ne bi usporila tijekom parsiranja ako je u njoj pohranjen ogroman JSON dokument, a zatim mu se pristupa putem polja. Ovaj dokument treba sadržavati sve podatke o pacijentu. Svi znamo koliko kartoni pacijenata mogu biti debeli. Maksimalna veličina kartice od 16 MB odmah stavlja točku na pacijente čija kartica bolesti uključuje MRI datoteke, rendgenske snimke i druge studije. U jednoj grani globala možete imati gigabajte i terabajte informacija. U principu, tome možemo stati na kraj, ali ja ću nastaviti.
  2. Vrijeme svijesti/promjena/brisanje novih svojstava u kartonu pacijenta. Takva baza podataka mora pročitati cijelu mapu u memoriju (ovo je velika količina!), analizirati BSON, dodati/promijeniti/izbrisati novi čvor, ažurirati indekse, spakirati je u BSON i spremiti na disk. Global samo treba pristupiti određenom svojstvu i njime manipulirati.
  3. Brzi pristup pojedinačnim svojstvima. S mnogo svojstava u dokumentu i njegovom strukturom na više razina, pristup pojedinačnim svojstvima bit će brži zbog činjenice da je svaka staza 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 s ugniježđenim nizovima) savršeno se uklapaju u globale. Na primjer, takav niz iz PHP-a bit će 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 pohranjuje u globalima. Može se postaviti na različite načine za pohranu.

XML
Najlakši način za raščlanjivanje XML-a na globale je pohranjivanje atributa oznake u čvorove. A ako je potreban brz pristup atributima oznake, možemo ih premjestiti u zasebne grane.

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dio

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

Na COS-u to bi 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 prikazivanja na globalima. U ovom slučaju nismo prikazali redoslijed podoznaka u oznaci bilješke. Globalno ^xml podoznake će biti prikazane abecednim redom. Da biste točno prikazali redoslijed, možete koristiti, na primjer, sljedeći prikaz:

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dio
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 o otvaranjima u šahu.

Debi baza podataka. Možete koristiti procjenu sile udara kao vrijednost indeksa globalnog čvora. Tada će za odabir najjačeg poteza biti dovoljno odabrati granu najveće težine. U globalu, sve grane na svakoj razini bit će poredane prema snazi ​​pokreta.

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dio

Struktura prodajnih ureda, struktura ljudi u MLM-u. Čvorovi mogu pohraniti određene vrijednosti predmemoriranja koje odražavaju karakteristike cijelog podstabla. Na primjer, obujam prodaje određenog podstabla. U svakom trenutku možemo dobiti brojku koja odražava postignuća bilo koje grane.

Globali su mačevi za pohranjivanje podataka. Drveće. 2. dio

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

Prvi stupac predstavlja slučajeve u kojima ćete dobiti značajan dobitak brzine korištenjem globala, a drugi kada će dizajn ili podatkovni model biti pojednostavljeni.

Ubrzati
Jednostavnost obrade/prezentacije podataka

  1. Umetanje [s automatskim sortiranjem na svakoj razini], [indeksiranje glavnim ključem]
  2. Uklanjanje podstabala
  3. Objekti s mnogo ugniježđenih svojstava koji zahtijevaju pojedinačni pristup
  4. Hijerarhijska struktura s mogućnošću zaobilaženja podređenih grana iz bilo koje grane, čak i one nepostojeće
  5. Obilaženje podstabala prvo u dubinu
  1. Objekti/entiteti s ogromnim brojem izbornih [i/ili ugniježđenih] svojstava/entiteta
  2. Podaci bez sheme. Kada se često mogu pojaviti nova svojstva, a stara nestati.
  3. Morate stvoriti prilagođenu bazu podataka.
  4. Baze putanja i stabla odlučivanja. Kada je zgodno prikazati staze kao stablo.
  5. Uklanjanje hijerarhijskih struktura bez korištenja rekurzije

Nastavak “Globali su mačevi s blagom za pohranu podataka. Rijetki nizovi. dio 3".

Izjava o odricanju od odgovornosti: Ovaj članak i moji komentari na njega moje su mišljenje i nemaju nikakve veze sa službenim stavom InterSystems Corporation.

Izvor: www.habr.com

Dodajte komentar