Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2Te begjinnen - sjoch diel 1.

3. Farianten fan struktueren by it brûken fan globalen

In struktuer lykas in bestelde beam hat ferskate spesjale gefallen. Litte wy dejingen beskôgje dy't praktyske wearde hawwe by it wurkjen mei globalen.

3.1 Spesjaal gefal 1. Ien knooppunt sûnder tûken


Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2Globalen kinne net allinich brûkt wurde as in array, mar ek as reguliere fariabelen. Bygelyks, as teller:

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

Yn dit gefal kin de globale, neist syn betsjutting, ek tûken hawwe. It iene slút it oare net út.

3.2 Spesjaal gefal 2. Ien toppunt en in protte tûken

Yn 't algemien is dit in klassike kaai-weardebasis. En as wy in tuple wearden as wearde bewarje, krije wy in heul gewoane tabel mei in primêre kaai.

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2

Om in tabel op globalen te ymplementearjen, sille wy sels rigen moatte generearje fan 'e kolomwearden, en dan bewarje se yn' e globale mei de primêre kaai. Om it mooglik te meitsjen om de snaar by it lêzen wer yn kolommen op te dielen, kinne jo gebrûk meitsje fan:

  1. skiedingstekens.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. in stive skema wêryn elk fjild beslacht in foarbeskaaide oantal bytes. Lykas wurdt dien yn relaasje databases.
  3. in spesjale funksje $ LB (beskikber yn Cache), dy't makket in string fan wearden.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Ynteressant is it net lestich om globalen te brûken om wat te dwaan lykas sekundêre yndeksen yn relasjonele databases. Litte wy sokke struktueren yndeks globalen neame. In yndeks globaal is in helpbeam foar fluch sykjen fan fjilden dy't gjin diel útmeitsje fan 'e primêre kaai fan' e wichtichste globale. Om it yn te foljen en te brûken, moatte jo ekstra koade skriuwe.

Litte wy in globale yndeks meitsje op 'e earste kolom.

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

No, om fluch te sykjen nei ynformaasje yn 'e earste kolom, moatte wy nei de globale sjen ^i en fyn de primêre kaaien (id) dy't oerienkomme mei de winske wearde fan 'e earste kolom.

By it ynfoegjen fan in wearde, kinne wy ​​fuortendaliks meitsje sawol de wearde en yndeks globals foar de fereaske fjilden. En foar betrouberens, litte wy it allegear yn in transaksje ynpakke.

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

Details oer hoe't jo it dwaan op M tabellen op globals, emulaasje fan sekundêre yndeksen.

Sokke tabellen sille sa fluch wurkje as yn tradisjonele databases (of noch flugger) as de funksjes foar it ynfoegje/bywurkjen/wiskje fan rigen wurde skreaun yn COS/M en kompilearre.Ik kontrolearre dizze ferklearring mei tests op bulk INSERT en SELECT yn ien twa-kolom tabel, ynklusyf it brûken fan de TSTART en TCOMMIT kommando (transaksjes).

Ik haw gjin kompleksere senario's hifke mei tagelyk tagong en parallelle transaksjes.

Sûnder transaksjes te brûken wie it ynfoegingsnivo 778 ynserts / sekonde per miljoen wearden.
Mei 300 miljoen wearden - 422 ynserts / sekonde.

By it brûken fan transaksjes - 572 inserts / sekonde foar 082M inserts. Alle operaasjes waarden útfierd út kompilearre M-koade.
Hurde skiven binne reguliere, net SSD. RAID5 mei Write-back. Phenom II 1100T prosessor.

Om in SQL-database op in fergelykbere manier te testen, moatte jo in opsleine proseduere skriuwe dy't ynfoegingen yn in lus sil útfiere. By it testen fan MySQL 5.5 (InnoDB-opslach), mei dizze metoade krige ik nûmers net mear as 11K ynserts per sekonde.
Ja, de ymplemintaasje fan tabellen op globalen sjocht komplekser as yn relationele databases. Dêrom hawwe yndustriële databases op globalen SQL-tagong om wurk mei tabelgegevens te ferienfâldigjen.

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2Yn 't algemien, as it gegevensskema net faak feroaret, is de ynfoegsnelheid net kritysk en kin de folsleine databank maklik fertsjintwurdige wurde yn' e foarm fan normalisearre tabellen, dan is it makliker om te wurkjen mei SQL, om't it in heger nivo fan abstraksje leveret .

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2Yn dit bysûndere gefal woe ik dat sjen litte globals kinne fungearje as konstruktor foar it meitsjen fan oare databases. As in assembler wêryn oare talen skreaun wurde kinne. Hjir binne foarbylden fan hoe't jo analogen kinne meitsje op globalen key-wearde, listen, sets, tabellaryske, dokumint-rjochte databases.

As jo ​​in soarte fan net-standert databank moatte oanmeitsje mei minimale ynspanning, dan moatte jo nei globalen sjen.

3.3 Spesjaal gefal 3. Twa-nivo beam, elk knooppunt fan it twadde nivo hat in fêst oantal tûken

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2Jo hawwe it wierskynlik rieden: dit is in alternative ymplemintaasje fan tabellen op globalen. Litte wy dizze ymplemintaasje fergelykje mei de foarige.

Tabellen op in twa-nivo beam vs. op in ien-nivo beam.

Минусы
Плюсы

  1. Stadiger foar ynfoegje, om't jo it oantal knopen lykweardich ynstelle moatte oan it oantal kolommen.
  2. Mear skiif romte konsumpsje. Sûnt globale yndeksen (ferstien as array yndeksen) mei kolom nammen nimme skiif romte en wurde duplicated foar eltse rige.

  1. Snellere tagong ta de wearden fan yndividuele kolommen, om't d'r gjin need is om de tekenrige te parsearjen. Neffens myn tests is it 11,5% flugger op 2 kolommen en mear op in grutter oantal kolommen.
  2. Makliker te feroarjen gegevens skema
  3. Mear dúdlike koade

Fermelding: net foar elkenien. Sûnt snelheid is ien fan de meast wichtige foardielen fan globals, der is net folle punt yn it brûken fan dizze ymplemintaasje, om't it nei alle gedachten sil útfiere net flugger as tabellen yn relational databases.

3.4 Algemiene saak. Beammen en bestelde beammen

Elke gegevensstruktuer dy't kin wurde fertsjintwurdige as in beam past perfekt by globalen.

3.4.1 Objekten mei subobjekten

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2

Dit is it gebiet fan tradisjoneel gebrûk fan globalen. Op it medyske fjild is d'r in grut oantal sykten, medisinen, symptomen en behannelingmetoaden. It is irrational om in tabel te meitsjen mei in miljoen fjilden foar elke pasjint. Boppedat sil 99% fan 'e fjilden leech wêze.

Stel jo in SQL-database fan tabellen foar: "pasjint" ~ 100 fjilden, "Medicijn" - 000 fjilden, "Terapy" - 100 fjilden, "Komplikaasjes" - 000 fjilden, ensfh. ensafuorthinne. Of jo kinne in database meitsje fan in protte tûzenen tabellen, elk foar in spesifyk type pasjint (en se kinne oerlappe!), Behannelingen, medisinen en tûzenen mear tabellen foar ferbiningen tusken dizze tabellen.

Globalen binne ideaal foar medisinen, om't se jo tastean om foar elke pasjint in krekte beskriuwing fan syn medyske skiednis, ferskate terapyen, en de aksjes fan medisinen te meitsjen, yn 'e foarm fan in beam, sûnder ekstra skiifromte te fergrieme op lege kolommen, lykas soe wêze it gefal yn in relaasje gefal.

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2Mei help fan globalen is it handich om in database te meitsjen mei gegevens oer minsken, as it wichtich is om in maksimum fan ferskate ynformaasje oer de kliïnt te sammeljen en te systematisearjen. Dit is yn fraach yn medisinen, bankieren, marketing, argivearjen en oare gebieten

.
Fansels kinne jo yn SQL ek in beam emulearje mei mar in pear tabellen (EAV, 1,2,3,4,5,6,7,8,9,10), dit is lykwols oanmerklik yngewikkelder en sil stadiger wêze. Yn essinsje soene jo in globale moatte skriuwe dy't wurket op tabellen en al it wurk mei tabellen ferbergje ûnder in abstraksjelaach. It is ferkeard om technology op legere nivo (globalen) te emulearjen mei technology op heger nivo (SQL). Net geskikt.

It is gjin geheime dat it feroarjen fan it gegevensskema op gigantyske tabellen (ALTER TABLE) in flinke tiid kin nimme. MySQL docht bygelyks ALTER TABLE ADD | DROP COLUMN troch folslein ynformaasje te kopiearjen fan 'e âlde tabel nei de nije tabel (teste MyISAM, InnoDB-motoren). Wat dagen, as net wiken, in wurkjende database mei miljarden records kin ophingje.

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2It feroarjen fan de gegevensstruktuer as wy globalen brûke, kostet ús neat. Wy kinne op elk momint alle nije eigenskippen tafoegje dy't wy nedich binne oan elk objekt, op elk nivo fan 'e hiërargy. Feroarings dy't ferbûn binne mei it omneamen fan tûken kinne wurde útfierd op 'e eftergrûn op in rinnende databank.


Dêrom, as it giet om it opslaan fan objekten mei in grut oantal opsjonele eigenskippen, binne globalen in geweldige kar.

Boppedat, lit my herinnerje jo dat tagong ta ien fan 'e eigenskippen is instant, sûnt yn de globale alle paden binne B-beammen.

Globale databases, yn 't algemien, binne in soarte fan dokumint-rjochte databank mei de mooglikheid om hiërargyske ynformaasje op te slaan. Dêrom kinne dokumint-rjochte databases konkurrearje mei globalen op it mêd fan it opslaan fan medyske records. Mar it is noch net hielendal itseldeLitte wy MongoDB nimme foar fergeliking. Yn dit domein it ferliest oan de globalen om de folgjende redenen:

  1. Dokumint grutte. De opslach-ienheid is tekst yn JSON-formaat (mear krekter BSON) mei in maksimum folume fan sawat 16MB. De beheining is spesifyk makke sadat de JSON-databank net fertrage by it parsearjen as in enoarm JSON-dokumint dêryn wurdt opslein en dan tagong ta fjilden. Dit dokumint moat alle ynformaasje oer de pasjint befetsje. Wy witte allegear hoe dik pasjintrecords kinne wêze. De maksimale kaartgrutte fan 16MB makket fuortendaliks in ein oan pasjinten waans syktekaart MRI-bestannen, röntgenscans en oare stúdzjes omfettet. Yn ien branch fan 'e wrâld kinne jo gigabytes en terabytes oan ynformaasje hawwe. Yn prinsipe kinne wy ​​hjir in ein oan meitsje, mar ik sil trochgean.
  2. Tiid fan bewustwêzen / feroaring / wiskjen fan nije eigenskippen yn 'e kaart fan' e pasjint. Sa'n databank moat lêze de hiele kaart yn it ûnthâld (dit is in grut bedrach!), parse BSON, tafoegje / feroarje / wiskje in nij knooppunt, update yndeksen, pack it yn BSON, en bewarje it op skiif. In globale hoecht allinich tagong te krijen ta in spesifyk eigendom en it te manipulearjen.
  3. Fluch tagong ta yndividuele eigenskippen. Mei in protte eigenskippen yn in dokumint en syn multi-level struktuer, tagong ta yndividuele eigenskippen sil wêze flugger fanwege it feit dat elk paad yn de globale is in B-beam. Yn BSON moatte jo it dokumint lineêr parse om it winske eigendom te finen.

3.3.2 Associative arrays

Associative arrays (sels mei nestede arrays) passe perfekt op globalen. Bygelyks, sa'n array fan PHP sil werjûn wurde yn 'e earste ôfbylding 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 Hierarchyske dokuminten: XML, JSON

Ek maklik opslein yn globals. Kin op ferskate manieren oanlein wurde foar opslach.

XML
De maklikste manier om XML te ûntbinen yn globalen is om tag-attributen op te slaan yn knopen. En as rappe tagong ta tag-attributen nedich is, dan kinne wy ​​se ferpleatse nei aparte tûken.

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2

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

Op COS soe dit oerienkomme mei de koade:

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

Opmerking: Foar XML, JSON, assosjative arrays kinne jo in protte ferskillende wizen komme foar werjaan op globalen. Yn dit gefal hawwe wy de folchoarder fan 'e subtags yn' e notysjetag net wjerspegele. Globaal ^xml subtags sille wurde werjûn yn alfabetyske folchoarder. Om de folchoarder strikt te reflektearjen, kinne jo bygelyks it folgjende display brûke:

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2
JSON.
De earste ôfbylding fan seksje 3.3.1 toant in refleksje fan dit JSON-dokumint:

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

3.3.4 Identike struktueren ferbûn troch hiërargyske relaasjes

Foarbylden: de struktuer fan ferkeapkantoaren, de lokaasje fan minsken yn in MLM-struktuer, de database fan iepenings yn it skaken.

Debuts databank. Jo kinne de skatting fan 'e slagkrêft brûke as de yndekswearde fan' e globale knooppunt. Dan, om de sterkste beweging te kiezen, sil it genôch wêze om de tûke te kiezen mei it grutste gewicht. Yn 'e wrâld sille alle tûken op elk nivo wurde sorteare op bewegingssterkte.

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2

De struktuer fan ferkeapkantoaren, de struktuer fan minsken yn MLM. Knooppunten kinne bepaalde caching-wearden opslaan dy't de skaaimerken fan 'e heule subtree wjerspegelje. Bygelyks, de ferkeap folume fan in opjûne subtree. Op elk momint kinne wy ​​​​in figuer krije dat de prestaasjes fan elke branch reflektearret.

Globalen binne skat-swurden foar it bewarjen fan gegevens. Beammen. Diel 2

4. Yn hokker gefallen is it meast foardielich om globals te brûken?

De earste kolom presintearret gefallen wêr't jo in signifikante snelheidswinst krije troch globals te brûken, en de twadde as it ûntwerp of gegevensmodel sil wurde ferienfâldige.

Speed
Gemak fan gegevensferwurking / presintaasje

  1. Ynfoegje [mei automatysk sortearjen op elk nivo], [yndeksearje troch masterkaai]
  2. Fuortsmite subtrees
  3. Objekten mei in protte nestele eigenskippen dy't yndividuele tagong fereaskje
  4. Hiërargyske struktuer mei de mooglikheid om bernetûken te omgean fan elke tûke, sels net-besteand
  5. Djipte-earste trochgong fan subtrees
  1. Objekten/entiteiten mei in grut oantal opsjonele [en/of nestele] eigenskippen/entiteiten
  2. Skema-minder gegevens. Wannear't nije eigenskippen faak ferskine kinne en âlde ferdwine.
  3. Jo moatte in oanpaste database oanmeitsje.
  4. Paad bases en beslút beammen. As it handich is om paden as in beam foar te stellen.
  5. Hiërargyske struktueren fuortsmite sûnder rekursje te brûken

Continuation "Globalen binne skatswurden foar it opslaan fan gegevens. Sparse arrays. diel 3".

Disclaimer: Dit artikel en myn opmerkingen dêrop binne myn miening en hawwe gjin relaasje mei de offisjele posysje fan InterSystems Corporation.

Boarne: www.habr.com

Add a comment