Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2Aan die gang - sien deel 1.

3. Variante van strukture wanneer globales gebruik word

'n Struktuur soos 'n geordende boom het verskeie spesiale gevalle. Kom ons kyk na diegene wat praktiese waarde het wanneer ons met globale mense werk.

3.1 Spesiale geval 1. Een nodus sonder takke


Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2Globale kan nie net soos 'n skikking gebruik word nie, maar ook soos gereelde veranderlikes. Byvoorbeeld, as 'n teller:

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

In hierdie geval kan die globale, benewens sy betekenis, ook takke hê. Die een sluit nie die ander uit nie.

3.2 Spesiale geval 2. Een hoekpunt en baie takke

Oor die algemeen is dit 'n klassieke sleutel-waarde basis. En as ons 'n tupel waardes as 'n waarde stoor, kry ons 'n baie gewone tabel met 'n primêre sleutel.

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2

Om 'n tabel op globale te implementeer, sal ons self rye moet genereer uit die kolomwaardes, en dit dan na die globale stoor deur die primêre sleutel te gebruik. Om dit moontlik te maak om die string weer in kolomme te verdeel tydens lees, kan jy gebruik:

  1. skeidingstekens.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. 'n rigiede skema waarin elke veld 'n voorafbepaalde aantal grepe beslaan. Soos in relasionele databasisse gedoen word.
  3. 'n spesiale funksie $LB (beskikbaar in Cache), wat 'n string waardes skep.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Interessant genoeg is dit nie moeilik om globales te gebruik om iets soortgelyk aan sekondêre indekse in relasionele databasisse te doen nie. Kom ons noem sulke strukture indeks globale. 'n Globale indeks is 'n hulpboom om velde vinnig te soek wat nie deel is van die primêre sleutel van die hoofglobaal nie. Om dit in te vul en te gebruik, moet jy addisionele kode skryf.

Kom ons skep 'n globale indeks in die eerste kolom.

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

Nou, om vinnig na inligting in die eerste kolom te soek, moet ons na die globale kyk ^i en vind die primêre sleutels (id) wat ooreenstem met die gewenste waarde van die eerste kolom.

Wanneer 'n waarde ingevoeg word, kan ons onmiddellik beide die waarde- en indeksglobale vir die vereiste velde skep. En vir betroubaarheid, kom ons draai dit alles in 'n transaksie.

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

Besonderhede oor hoe om dit te doen op M tabelle oor globale, emulasie van sekondêre indekse.

Sulke tabelle sal so vinnig werk soos in tradisionele databasisse (of selfs vinniger) as die funksies vir die invoeging/bywerking/verwydering van rye in COS/M geskryf en saamgestel word.Ek het hierdie stelling nagegaan met toetse op grootmaat INSERT en SELECT in een twee-kolom tabel, insluitend die gebruik van die TSTART en TCOMMIT opdragte (transaksies).

Ek het nie meer komplekse scenario's met gelyktydige toegang en parallelle transaksies getoets nie.

Sonder die gebruik van transaksies was die invoegingskoers 778 361 invoegings/sekonde per miljoen waardes.
Met 300 miljoen waardes - 422 invoegings/sekonde.

Wanneer transaksies gebruik word - 572 082 insetsels/sekonde vir 50M insetsels. Alle bewerkings is uitgevoer vanaf saamgestelde M-kode.
Hardeskywe is gereeld, nie SSD nie. RAID5 met terugskryf. Phenom II 1100T verwerker.

Om 'n SQL-databasis op 'n soortgelyke manier te toets, moet jy 'n gestoorde prosedure skryf wat invoegings in 'n lus sal uitvoer. Toe ek MySQL 5.5 (InnoDB-berging) getoets het, het ek met hierdie metode nommers van nie meer as 11K-invoegings per sekonde ontvang nie.
Ja, die implementering van tabelle op globales lyk meer kompleks as in relasionele databasisse. Industriële databasisse op globale data het dus SQL-toegang om werk met tabeldata te vereenvoudig.

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2Oor die algemeen, as die dataskema nie gereeld sal verander nie, is die invoegspoed nie krities nie en die hele databasis kan maklik in die vorm van genormaliseerde tabelle voorgestel word, dan is dit makliker om met SQL te werk, aangesien dit 'n hoër vlak van abstraksie bied .

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2In hierdie spesifieke geval wou ek dit wys globals kan optree as 'n konstruktor vir die skep van ander databasisse. Soos 'n samesteller waarin ander tale geskryf kan word. Hier is voorbeelde van hoe jy analoë op globales kan skep sleutel-waarde, lyste, stelle, tabelvorm, dokument-georiënteerde databasisse.

As jy 'n soort nie-standaard databasis met minimale moeite moet skep, moet jy na globales kyk.

3.3 Spesiale geval 3. Twee-vlak boom, elke nodus van die tweede vlak het 'n vaste aantal takke

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2Jy het waarskynlik reg geraai: dit is 'n alternatiewe implementering van tabelle op globale. Kom ons vergelyk hierdie implementering met die vorige een.

Tabelle op 'n twee-vlak boom vs. op 'n enkelvlak boom.

Nadele
Pros

  1. Stadiger vir invoeging, aangesien jy die aantal nodusse gelyk moet stel aan die aantal kolomme.
  2. Meer skyfspasieverbruik. Aangesien globale indekse (wat as skikkingsindekse verstaan ​​word) met kolomname skyfspasie opneem en vir elke ry gedupliseer word.

  1. Vinniger toegang tot die waardes van individuele kolomme, aangesien dit nie nodig is om die string te ontleed nie. Volgens my toetse is dit 11,5% vinniger op 2 kolomme en meer op 'n groter aantal kolomme.
  2. Makliker om dataskema te verander
  3. Meer duidelike kode

Gevolgtrekking: nie vir almal nie. Aangesien spoed een van die belangrikste voordele van globale is, is daar min sin om hierdie implementering te gebruik, aangesien dit heel waarskynlik nie vinniger sal werk as tabelle in relasionele databasisse nie.

3.4 Algemene saak. Bome en geordende bome

Enige datastruktuur wat as 'n boom voorgestel kan word, pas perfek by globales.

3.4.1 Voorwerpe met subvoorwerpe

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2

Dit is die gebied van tradisionele gebruik van globale. In die mediese veld is daar 'n groot aantal siektes, medikasie, simptome en behandelingsmetodes. Dit is irrasioneel om 'n tabel met 'n miljoen velde vir elke pasiënt te skep. Boonop sal 99% van die velde leeg wees.

Stel jou 'n SQL-databasis van tabelle voor: "pasiënt" ~ 100 000 velde, "Medisin" - 100 000 velde, "Terapie" - 100 000 velde, "Komplikasies" - 100 000 velde, ens. en so aan. Of jy kan 'n databasis van baie duisende tabelle skep, elk vir 'n spesifieke tipe pasiënt (en hulle kan oorvleuel!), behandelings, medikasie en nog duisende tabelle vir verbindings tussen hierdie tabelle.

Globale is ideaal vir medisyne, aangesien dit jou in staat stel om vir elke pasiënt 'n akkurate beskrywing van sy mediese geskiedenis, verskeie terapieë en die aksies van medikasie te skep, in die vorm van 'n boom, sonder om ekstra skyfspasie op leë kolomme te mors, soos sou die geval wees in 'n verhoudingsgeval.

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2Deur globals te gebruik, is dit gerieflik om 'n databasis met data oor mense te skep, wanneer dit belangrik is om 'n maksimum van verskeie inligting oor die kliënt te versamel en te sistematiseer. Dit is in aanvraag in medisyne, bankwese, bemarking, argivering en ander gebiede

.
Natuurlik, in SQL kan jy ook 'n boom naboots met net 'n paar tabelle (EAV uitbreiding, 1,2,3,4,5,6,7,8,9,10), maar dit is aansienlik meer ingewikkeld en sal stadiger wees. In wese sal jy 'n globale moet skryf wat op tabelle werk en al die werk met tabelle onder 'n abstraksielaag moet versteek. Dit is verkeerd om laervlaktegnologie (globale) na te boots deur hoërvlaktegnologie (SQL) te gebruik. Onvanpas.

Dit is geen geheim dat die verandering van die data skema op reuse tabelle (ALTER TABLE) 'n redelike hoeveelheid tyd kan neem. MySQL, byvoorbeeld, doen ALTER TABLE ADD | DROP KOLOM deur die volledige inligting van die ou tabel na die nuwe tabel te kopieer (getoets MyISAM, InnoDB-enjins). Wat 'n werkende databasis met miljarde rekords kan ophang vir dae, indien nie weke nie.

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2Om die datastruktuur te verander as ons globales gebruik, kos ons niks nie. Ons kan enige tyd enige nuwe eienskappe wat ons nodig het by enige voorwerp voeg, op enige vlak van die hiërargie. Veranderinge wat verband hou met die hernoeming van takke kan in die agtergrond op 'n lopende databasis uitgevoer word.


Daarom, wanneer dit kom by die berging van voorwerpe met 'n groot aantal opsionele eienskappe, is globales 'n goeie keuse.

Laat ek jou boonop herinner dat toegang tot enige van die eiendomme onmiddellik is, aangesien alle paaie in die wêreld B-bome is.

Globale databasisse, in die algemeen, is 'n tipe dokument-georiënteerde databasis met die vermoë om hiërargiese inligting te stoor. Daarom kan dokument-georiënteerde databasisse meeding met globale mense op die gebied van die berging van mediese rekords. Maar dit is steeds nie heeltemal dieselfde nieKom ons neem MongoDB vir vergelyking. In hierdie domein dit verloor teen die globale om die volgende redes:

  1. Dokument grootte. Die stooreenheid is teks in JSON-formaat (meer presies BSON) met 'n maksimum volume van ongeveer 16MB. Die beperking is spesifiek gemaak sodat die JSON-databasis nie vertraag tydens ontleding as 'n groot JSON-dokument daarin gestoor word en dan deur velde verkry word nie. Hierdie dokument moet alle inligting oor die pasiënt bevat. Ons weet almal hoe dik pasiëntrekords kan wees. Die maksimum kaartgrootte van 16MB maak onmiddellik 'n einde aan pasiënte wie se siektekaart MRI-lêers, X-straalskanderings en ander studies insluit. In een tak van die wêreld kan jy gigagrepe en teragrepe van inligting hê. In beginsel kan ons 'n einde hieraan maak, maar ek sal voortgaan.
  2. Tyd van bewussyn/verandering/skrap van nuwe eienskappe in die pasiënt se grafiek. So 'n databasis moet die hele kaart in die geheue lees (dit is 'n groot hoeveelheid!), BSON ontleed, 'n nuwe nodus byvoeg/verander/skrap, indekse opdateer, dit in BSON pak en op skyf stoor. 'n Globale hoef slegs toegang tot 'n spesifieke eiendom te kry en dit te manipuleer.
  3. Vinnige toegang tot individuele eiendomme. Met baie eiendomme in 'n dokument en sy multivlakstruktuur, sal toegang tot individuele eiendomme vinniger wees as gevolg van die feit dat elke pad in die globale 'n B-boom is. In BSON moet u die dokument lineêr ontleed om die verlangde eienskap te vind.

3.3.2 Assosiatiewe skikkings

Assosiatiewe skikkings (selfs met geneste skikkings) pas perfek op globale. So 'n skikking van PHP sal byvoorbeeld in die eerste prent 3.3.1 vertoon word.

$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 Hiërargiese dokumente: XML, JSON

Ook maklik gestoor in globals. Kan op verskillende maniere uitgelê word vir berging.

XML
Die maklikste manier om XML in globale te ontbind, is om merkerkenmerke in nodusse te stoor. En as vinnige toegang tot merkkenmerke nodig is, kan ons dit na aparte takke skuif.

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2

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

Op COS sal dit ooreenstem met die kode:

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

Opmerking: Vir XML, JSON, assosiatiewe skikkings, kan jy met baie verskillende maniere vorendag kom om op globale vertoon te word. In hierdie geval het ons nie die volgorde van die submerkers in die notamerker weerspieël nie. Wêreldwyd ^xml submerkers sal in alfabetiese volgorde vertoon word. Om die volgorde streng weer te gee, kan jy byvoorbeeld die volgende vertoning gebruik:

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2
JSON.
Die eerste prent van afdeling 3.3.1 toon 'n weerspieëling van hierdie JSON-dokument:

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

3.3.4 Identiese strukture wat deur hiërargiese verwantskappe verbind word

Voorbeelde: die struktuur van verkoopskantore, die ligging van mense in 'n MLM-struktuur, die databasis van openinge in skaak.

Debut databasis. Jy kan die slagkragskatting as die indekswaarde van die globale nodus gebruik. Dan, om die sterkste beweging te kies, sal dit genoeg wees om die tak met die grootste gewig te kies. In die globale sal alle takke op elke vlak gesorteer word volgens skuifsterkte.

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2

Die struktuur van verkoopskantore, die struktuur van mense in MLM. Nodusse kan sekere kaswaardes stoor wat die eienskappe van die hele subboom weerspieël. Byvoorbeeld, die verkoopsvolume van 'n gegewe subboom. Op enige oomblik kan ons 'n syfer kry wat die prestasies van enige tak weerspieël.

Globale is skatte-swaarde vir die stoor van data. Bome. Deel 2

4. In watter gevalle is dit die voordeligste om globale toestelle te gebruik?

Die eerste kolom bied gevalle waar jy 'n aansienlike spoedtoename sal kry deur globales te gebruik, en die tweede wanneer die ontwerp of datamodel vereenvoudig sal word.

Spoed
Gemak van dataverwerking/aanbieding

  1. Invoeging [met outomatiese sortering op elke vlak], [indeksering volgens hoofsleutel]
  2. Verwydering van subbome
  3. Voorwerpe met baie geneste eienskappe wat individuele toegang vereis
  4. Hiërargiese struktuur met die vermoë om kindertakke van enige tak te omseil, selfs nie-bestaandes
  5. Diepte-eerste deurkruising van subbome
  1. Voorwerpe/entiteite met 'n groot aantal opsionele [en/of geneste] eienskappe/entiteite
  2. Skemalose data. Wanneer nuwe eiendomme dikwels kan verskyn en oues verdwyn.
  3. Jy moet 'n persoonlike databasis skep.
  4. Padbasisse en besluitnemingsbome. Wanneer dit gerieflik is om paaie as 'n boom voor te stel.
  5. Die verwydering van hiërargiese strukture sonder om rekursie te gebruik

Uitbreiding "Globals is skatte-swaarde om data te stoor. Skaars skikkings. Deel 3".

Vrywaring: Hierdie artikel en my kommentaar daarop is my mening en verteenwoordig nie die amptelike standpunt van InterSystems Corporation nie.

Bron: will.com

Voeg 'n opmerking