I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2Accuminciari - vede a parte 1.

3. Varianti di strutture quandu usanu globals

Una struttura cum'è un arbre urdinatu hà parechji casi speciali. Cunsideremu quelli chì anu un valore praticu quandu u travagliu cù globals.

3.1 Casu speciale 1. Un node senza rami


I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2Globals pò esse usatu micca solu cum'è un array, ma ancu cum'è variabili regulari. Per esempiu, cum'è un contatore:

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

In questu casu, u glubale, in più di u so significatu, pò ancu avè rami. Unu ùn esclude micca l'altru.

3.2 Casu particulari 2. Un vertice è parechje rami

In generale, questu hè una basa di chjave-valore classica. È se salvemu una tupla di valori cum'è un valore, uttene una tavola assai ordinaria cù una chjave primaria.

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2

Per implementà una tavula nantu à i globals, avemu da generà noi stessi fila da i valori di a colonna, è poi salvà à u glubale utilizendu a chjave primaria. Per fà pussibule di dividisce a stringa in colonne di novu quandu leghje, pudete aduprà:

  1. caratteri delimitatori.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. un schema rigidu in quale ogni campu occupa un numeru predeterminatu di bytes. Cumu hè fattu in basa di dati relazionale.
  3. una funzione speciale $LB (dispunibule in Cache), chì crea una stringa di valori.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Curiosamente, ùn hè micca difficiule d'utilizà globals per fà qualcosa simili à l'indici secundari in basa di dati relazionale. Chjamemu tali strutture index globals. Un indice globale hè un arbre ausiliariu per a ricerca rapida di campi chì ùn sò micca parte di a chjave primaria di u principale globale. Per compie è aduprà, avete bisognu di scrive codice supplementu.

Creemu un indice globale nantu à a prima colonna.

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

Avà, per circà rapidamente l'infurmazioni in a prima colonna, avemu da guardà in u glubale ^i è truvate e chjave primarie (id) chì currispondenu à u valore desideratu di a prima colonna.

Quandu inserisce un valore, pudemu creà immediatamente u valore è l'indici globale per i campi necessarii. È per affidabilità, mettimu tuttu in una transazzione.

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

I dettagli nantu à cumu fà nantu à M tavule nantu à i globals, emulazione di indici secondari.

Tali tavule funziunaranu cum'è in e basa di dati tradiziunali (o ancu più veloce) se e funzioni per inserisce / aghjurnà / sguassà fila sò scritte in COS / M è compilate.Aghju verificatu sta dichjarazione cù teste nantu à INSERT è SELECT in massa in una tavola di dui culonne, cumprese l'usu di i cumandamenti TSTART è TCOMMIT (transazzioni).

Ùn aghju micca pruvatu scenarii più cumplessi cù accessu simultanee è transazzioni parallele.

Senza usu di transazzione, a tarifa di inserimentu era 778 361 inseriti / secondu per milione di valori.
Cù 300 milioni di valori - 422 inserti / secondu.

Quandu si usa transazzione - 572 inserti / secondu per 082M inserti. Tutte e operazioni sò state realizate da u codice M compilatu.
I discu duru sò regularmente, micca SSD. RAID5 cù Write-back. Processore Phenom II 1100T.

Per pruvà una basa di dati SQL in una manera simile, avete bisognu di scrive una prucedura almacenata chì farà inserisce in un ciclu. Quandu teste MySQL 5.5 (almacenamiento InnoDB), utilizendu stu metudu aghju ricevutu numeri micca più di 11K inseriti per seconda.
Iè, l'implementazione di tavule nantu à i globals pare più cumplessu chè in basa di dati relazionale. Dunque, e basa di dati industriali nantu à i globals anu accessu SQL per simplificà u travagliu cù dati tabulari.

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2In generale, se u schema di dati ùn cambia micca spessu, a velocità di inserimentu ùn hè micca critica è tutta a basa di dati pò esse facilmente rapprisintata in forma di tavule normalizate, allora hè più faciule per travaglià cù SQL, postu chì furnisce un livellu più altu di astrazione. .

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2In questu casu particulari, vulia dimustrà chì globals ponu agisce cum'è un custruttore per creà altre basa di dati. Cum'è un assembler in quale altre lingue ponu esse scritte. Eccu esempi di cumu pudete creà analogi nantu à i globals chjave-valore, listi, seti, tabulari, basa di dati orientati à documentu.

Sè avete bisognu di creà un tipu di basa di dati non standard cù un minimu sforzu, allora duvete guardà versu globals.

3.3 Casu speciale 3. Arbulu di dui livelli, ogni node di u sicondu livellu hà un numeru fissu di rami

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2Probabilmente l'avete indovinatu: questu hè una implementazione alternativa di tavule nantu à i globals. Comparamu sta implementazione cù a precedente.

Tavule nantu à un arbre à dui livelli vs. nantu à un arbulu unicu livellu.

Минусы
Плюсы

  1. Più lento per l'inserimentu, postu chì avete bisognu di stabilisce u numeru di nodi uguali à u numeru di colonne.
  2. U cunsumu di più spaziu di discu. Siccomu l'indici glubale (cumpresu cum'è indici di array) cù nomi di colonna occupanu spaziu di discu è sò duplicati per ogni fila.

  1. Accessu più veloce à i valori di e colonne individuali, postu chì ùn ci hè bisognu di analizà a stringa. Sicondu i mo testi, hè 11,5% più veloce nantu à e culonni 2 è più nantu à un numeru più grande di colonne.
  2. Hè più faciule per cambià u schema di dati
  3. Codice più chjaru

Cunsigliu: micca per tutti. Siccomu a velocità hè unu di i benefizii più chjave di i globals, ùn ci hè pocu puntu in l'usu di sta implementazione, postu ch'ella ùn hà micca prubabilmente fà più veloce di e tavule in basa di dati relazionale.

3.4 Casu generale. Arburi è arburi urdinati

Qualchese struttura di dati chì pò esse rapprisintata cum'è un arbre si adatta perfettamente à i globals.

3.4.1 Oggetti cù suboggetti

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2

Questu hè l'area di usu tradiziunale di globals. In u campu di a medicina ci hè un gran numaru di malatie, medicazione, sintomi è metudi di trattamentu. Hè irrazionale per creà una tavola cù un milione di campi per ogni paziente. Inoltre, u 99% di i campi seranu vioti.

Imagine una basa di dati SQL di tavule: "paziente" ~ 100 campi, "Medicina" - 000 campi, "Terapia" - 100 campi, "Complicazioni" - 000 campi, etc. eccetera. O pudete creà una basa di dati di parechji millaie di tavule, ognunu per un tipu specificu di paci (è si ponu sovrappone!), Trattamenti, medicazione, è millaie più tavule per cunnessione trà sti tavule.

I Globals sò ideali per a medicina, perchè permettenu di creà per ogni paziente una descrizzione precisa di a so storia medica, diverse terapie è l'azzioni di i medicazione, in forma d'arbulu, senza perdi un spaziu di discu extra nantu à colonne viote, cum'è averia. esse u casu in un casu relazionale.

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2Utilizendu globals hè cunvenutu per creà una basa di dati cù dati nantu à e persone, Quandu hè impurtante per accumulà è sistematizà un massimu di varie informazioni nantu à u cliente. Questu hè in dumanda in medicina, banca, marketing, archiviu è altri spazii

.
Di sicuru, in SQL pudete ancu emulà un arbre cù uni pochi di tavule (EAV, 1,2,3,4,5,6,7,8,9,10), ma questu hè significativamente più cumplicatu è serà più lento. Essenzialmente, avete da scrive un glubale chì travaglia nantu à e tavule è ammuccià tuttu u travagliu cù tavule sottu una capa di astrazione. Hè sbagliatu per emulà a tecnulugia di livellu più bassu (globali) cù a tecnulugia di livellu più altu (SQL). Inappropriatu.

Ùn hè micca un sicretu chì cambià u schema di dati nantu à i tavulini giganti (ALTER TABLE) pò piglià una bona quantità di tempu. MySQL, per esempiu, face ALTER TABLE ADD | DROP COLUMN copiendu cumplettamente l'infurmazioni da a vechja tavola à a nova tavola (prova MyISAM, mutori InnoDB). Chì pò chjappà una basa di dati di travagliu cù miliardi di registri per ghjorni, se micca settimane.

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2Cambià a struttura di dati se usemu globals ùn ci costa nunda. In ogni mumentu pudemu aghjunghje ogni nova proprietà chì avemu bisognu à qualsiasi ughjettu, à ogni livellu di a ghjerarchia. I cambiamenti assuciati à rinominà i rami ponu esse eseguiti in fondo nantu à una basa di dati in esecuzione.


Dunque, quandu si tratta di almacenà l'uggetti cù un gran numaru di pruprietà opcional, i globals sò una grande scelta.

Inoltre, lasciami ricurdà chì l'accessu à qualsiasi di e pruprietà hè immediata, postu chì in u glubale tutti i camini sò B-arburi.

E basa di dati glubale, in generale, sò un tipu di basa di dati orientata à documentu cù a capacità di almacenà l'infurmazioni gerarchiche. Dunque, e basa di dati orientate à i documenti ponu cumpete cù i globals in u campu di l'almacenamiento di registri medichi. Ma ùn hè ancu micca u listessuPigliemu MongoDB per paragunà. In stu duminiu perde à i globals per i seguenti motivi:

  1. Dimensione di u documentu. L'unità di almacenamiento hè testu in formatu JSON (più precisamente BSON) cù un voluminu massimu di circa 16MB. A restrizione hè stata fatta apposta per chì a basa di dati JSON ùn rallenta micca durante l'analisi se un documentu JSON enormu hè almacenatu in questu è dopu accede da i campi. Stu documentu deve cuntene tutte l'infurmazioni nantu à u paziente. Tutti sapemu quantu grossi i registri di i pazienti ponu esse. A dimensione massima di a carta di 16MB mette immediatamente fine à i pazienti chì a carta di a malatia include file MRI, scans di raghji X è altri studii. In un ramu di u glubale pudete avè gigabyte è terabytes d'infurmazioni. In principiu, pudemu mette fine à questu, ma continueraghju.
  2. Tempu di cuscenza / cambiamentu / eliminazione di e novi proprietà in u cartulare di u paci. Una tale basa di dati deve leghje a mappa sana in memoria (questu hè una grande quantità!), Parse BSON, aghjunghje / cambià / sguassate un novu node, aghjurnà l'indici, imballà in BSON, è salvà à u discu. Un globale solu deve accede à una pruprietà specifica è manipulà.
  3. Accessu rapidu à e proprietà individuali. Cù parechje pruprietà in un documentu è a so struttura multi-livellu, l'accessu à e proprietà individuali serà più veloce per u fattu chì ogni strada in u glubale hè un B-tree. In BSON, avete da analizà linearmente u documentu per truvà a pruprietà desiderata.

3.3.2 Arrays assuciativi

Arrays associativi (ancu cù arrays nidificati) si adattanu perfettamente à i globals. Per esempiu, un tali array da PHP serà visualizatu in a prima stampa 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 Documenti gerarchici: XML, JSON

Ancu facilmente almacenatu in globals. Pò esse disposti in diversi modi per u almacenamentu.

XML
A manera più faciule di scumpressà XML in globals hè di almacenà l'attributi tag in nodi. È se l'accessu rapidu à l'attributi tag hè necessariu, allora pudemu spustà in rami separati.

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2

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

In COS questu currisponde à u codice:

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

Cumentu: Per XML, JSON, arrays associative, pudete vene cù parechje modi diffirenti di vede nantu à i globals. In questu casu, ùn avemu micca riflette l'ordine di i subtags in l'etichetta di nota. In u mondu ^ xml i subtags seranu affissati in ordine alfabeticu. Per riflette strettamente l'ordine, pudete aduprà, per esempiu, a visualizazione seguente:

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2
JSON.
A prima stampa da a sezione 3.3.1 mostra una riflessione di stu documentu JSON:

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

3.3.4 Strutture identiche cunnesse da relazioni gerarchiche

Esempii: a struttura di l'uffizii di vendita, u locu di e persone in una struttura MLM, a basa di dati di aperture in scacchi.

Debuts database. Pudete utilizà l'estimazione di forza di colpu cum'è u valore di l'indice di u node glubale. Allora, per sceglie u muvimentu più forte, serà abbastanza per sceglie u ramu cù u pesu più grande. In u glubale, tutti i rami à ogni livellu seranu ordinati per forza di muvimentu.

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2

A struttura di l'uffizii di vendita, a struttura di e persone in MLM. I nodi ponu almacenà certi valori di caching chì riflettenu e caratteristiche di tuttu u subtree. Per esempiu, u voluminu di vendita di un subtree datu. In ogni mumentu pudemu avè una figura chì riflette i rializazioni di ogni ramu.

I Globali sò spade di tesoru per almacenà dati. Arburi. Parte 2

4. In chì casi hè più benefiziu per aduprà globals ?

A prima colonna presenta casi induve uttene un guadagnu di velocità significativu usendu globals, è a seconda quandu u disignu o mudellu di dati serà simplificatu.

Speed
Facilità di trattamentu / presentazione di dati

  1. Inserzione [cù ordinamentu automaticu à ogni livellu], [indexazione per chjave maestra]
  2. Eliminazione di i subarburi
  3. Oggetti cù assai proprietà nidificate chì necessitanu accessu individuale
  4. Struttura gerarchica cù a capacità di scaccià i rami di i zitelli da ogni ramu, ancu inesistenti
  5. A prufundità-prima traversa di i subtrees
  1. Oggetti / entità cù un gran numaru di proprietà / entità opzionali [e / o nidificate].
  2. Dati senza schema. Quandu i novi pruprietà spessu ponu appare è i vechji spariscenu.
  3. Avete bisognu di creà una basa di dati persunalizata.
  4. Basi di caminu è arburi di decisione. Quandu hè cunvenutu per rapprisintà i camini cum'è un arbre.
  5. Eliminazione di e strutture gerarchiche senza l'usu di recursione

Continuazione "I global sò spade di tesoru per almacenà e dati. Arrays sparsi. Parte 3".

Légales: Questu articulu è i mo cumenti sò a mo opinione è ùn anu micca relazione cù a pusizione ufficiale di InterSystems Corporation.

Source: www.habr.com

Add a comment