GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2Fillimi — shiko pjesĂ«n 1.

3. Opcione strukturore me përdorimin e globalëve

Një strukturë si një pemë e renditur ka shumë raste të veçanta. Le të shqyrtojmë ato që kanë vlerë praktike kur punojmë me globalët.

3.1 Rasti i veçantë 1. Një nod pa degë


GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2GlobalĂ«t mund tĂ« pĂ«rdoren jo vetĂ«m si njĂ« masĂ«, por edhe si variabla tĂ« zakonshĂ«m. PĂ«r shembull si njĂ« numĂ«rues:

Set ^counter = 0  ; vendosja e numëruesit
Set id=$Increment(^counter) ;  inkrementim atomar

Në këtë mënyrë, globalet, përveç vlerës, mund të kenë edhe degë. Njëra nuk e përjashton tjetrën.

3.2 Rasti i veçantë 2. Një majë dhe shumë degë

Në përgjithësi, kjo është një bazë klasike key-value. Dhe nëse ruajmë një tuple vlerash si vlerë, atëherë do të marrim një tabelë të zakonshme me një çelës primar.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2

Për të realizuar tabelën në globalë, na duhen të formojmë vetë rreshtat nga vlerat e kolonave, dhe pastaj t'i ruajmë ata në global sipas çelësit primar. Për të ndarë përsëri rreshtin në kolona, mund të përdorim:

  1. simbolet ndarëse.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. një skemë të fortë, ku çdo fushë zë një numër të paracaktuar bajtash. Siç bëhet në DB-të relacionale.
  3. një funksion të veçantë $LB (i pranishëm në Cache), që krijon një rresht nga vlerat.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Çudi, nuk pĂ«rbĂ«n njĂ« vuajtje pĂ«r tĂ« krijuar diçka tĂ« ngjashme me indeksĂ«t dytĂ«sorĂ« nĂ« DB-tĂ« relacionale. Le t'i quajmĂ« kĂ«to struktura globalĂ« indekse. NjĂ« global indeks Ă«shtĂ« njĂ« pemĂ« ndihmĂ«se pĂ«r kĂ«rkesa tĂ« shpejta sipas fushave, qĂ« nuk janĂ« pjesĂ« pĂ«rbĂ«rĂ«se tĂ« çelĂ«sit primar tĂ« globalit kryesor. PĂ«r ta mbushur dhe shqyrtuar, duhet tĂ« shkruajmĂ« kod shtesĂ«.

Le të krijojmë një global indeks sipas kolonës së parë.

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

Tani për kërkesa të shpejta për informacion sipas kolonës së parë, duhet të shkojmë te globali ^i dhe të gjejmë çelësat primarë (id) përkatës të vlerës së duhur të kolonës së parë.

Kur shtojmë një vlerë, ne mund të krijojmë menjëherë si vlerën ashtu edhe globalët indekse për fushat e nevojshme. Dhe për siguri, do ta mbështjellim këtë në një transaksion.

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

Detaje se si të bëjmë në M tabelat në globalë, emulimin e indekseve të dytë.

Këto tabela do të funksionojnë po aq shpejt sa në DB-të tradicionale (ose madje më shpejt), nëse funksionet për shtimin/përditësimin/fshirjen e rreshtave janë shkruar në COS/M dhe të kompilohen.Këtë deklaratë e kam verifikuar me teste në INSERT dhe SELECT masive në një tabelë me dy kolona, duke përdorur gjithashtu komandat TSTART dhe TCOMMIT (transaksione).

Nuk kam testuar skenarë më të komplikuar me qasje konkurente dhe transaksione paralele.

Pa përdorimin e transaksioneve, shpejtësia e insertimeve ishte 778,361 inserte/sekond për një milion vlerash.
PĂ«r 300 milion vlera — 422,141 inserte/sekond.

Duke pĂ«rdorur transaksione — 572,082 inserte/sekond pĂ«r 50M inserte. TĂ« gjitha operacionet janĂ« kryer nga kodi M i kompiluar.
Hard disqet ishin të zakonshëm, jo SSD. RAID5 me Write-back. Procesori Phenom II 1100T.

Për një test të ngjashëm SQL-baze, duhet të shkruajmë një procedurë të ruajtur, e cila në cikël do të bëjë inserte. Kur kam testuar MySQL 5.5 (ruajtja InnoDB) me këtë metodë, kam marrë shifra jo më shumë se 11K inserte në sekond.
Po, realizimi i tabelave në globalë duket më i komplikuar se në DB-të relacionale. Prandaj, DB-të industriale në globalë kanë qasje SQL për të thjeshtuar punën me të dhënat tabelar.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2NĂ«se skema e tĂ« dhĂ«nave nuk do tĂ« ndryshojĂ« shpesh, shpejtĂ«sia e inserimeve nuk Ă«shtĂ« kritike, dhe e gjithĂ« baza mund tĂ« paraqitet lehtĂ«sisht si tabela tĂ« normalizuara, atĂ«herĂ« Ă«shtĂ« mĂ« e lehtĂ« tĂ« punosh me SQL, pasi ai ofron njĂ« nivel mĂ« tĂ« lartĂ« abstraksioni.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2NĂ« kĂ«tĂ« rast tĂ« veçantĂ«, doja tĂ« tregoja se globalĂ«t mund tĂ« shĂ«rbejnĂ« si njĂ« ndihmĂ«s pĂ«r krijimin e DB-ve tĂ« tjera. Si njĂ« assembler, mbi tĂ« cilin mund tĂ« shkruhen gjuhĂ« tĂ« tjera. Ja disa shembuj se si mund tĂ« krijohen nĂ« globalĂ« analogjitĂ« e key-value, lista, grupe, tabela, qenĂ«-lidhur DB.

Nëse duhet të krijoni një DB jo standard me përpjekje minimale, ia vlen të shikoni në drejtimin e globalëve.

3.3 Rasti i veçantë 3. Pemë dy-nivëlore, ku secili nod i niveleve të dyta ka një numër të fiksuar degësh

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2Sigurisht, keni marrĂ« vesh: kjo Ă«shtĂ« njĂ« realizim alternativ i tabelave nĂ« globalĂ«. Le ta krahasojmĂ« kĂ«tĂ« realizim me atĂ« tĂ« mĂ«parshmin.

Tabelat në pemën dy-nivëlore vs. në pemën një-nivëlore.

Kundrat
Përfitimet

  1. Më të ngadalshëm për insertim, pasi duhet të vendosim numrin e nodave të barabartë me numrin e kolonave.
  2. Më shumë hapësirë e diskut. Indekset globale (në kuptimin si indekset e arrays) me emrat e kolonave marrin hapësirë në disk dhe përsëriten për çdo rresht.

  1. Qasje më e shpejtë në vlerat e kolonave të veçanta, sepse nuk është e nevojshme të analizohet rreshti. Sipas testeve të mia, më shpejt 11.5% për 2 kolona dhe më shumë për numrin e madh të kolonave.
  2. Më e lehtë për të ndryshuar skemën e të dhënave
  3. Më e qartë kodi

Dalja: sipër. Për shkak se shpejtësia është një nga avantazhet kryesore të globaleve, nuk ka shumë kuptim të përdorësh këtë realizim, pasi ndoshta do të funksionojë jo më shpejt se tabelat në bazat e të dhënave relacionale.

3.4 Rast i përgjithshëm. Pemet dhe pemët e renditura

Çdo strukturĂ« tĂ« dhĂ«nash qĂ« mund tĂ« paraqitet si pemĂ«, pĂ«rshtatet nĂ« mĂ«nyrĂ« tĂ« shkĂ«lqyer me globale.

3.4.1 Objekte me nënobjekte

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2

Ky është një fushë tradicionale e aplikimit të globaleve. Në fushën mjekësore, ka një numër të madh sëmundjesh, barnash, simptomash, metodash trajtimi. Të krijosh një tabelë për secilin pacient me miliona fusha është joefikase. Në veçanti, 99% e fushave do të ishin të zbrazëta.

Imagjinoni njĂ« DB SQL pĂ«r tabelat: "pacienti" ~ 100,000 fusha, "Barnat" — 100,000 fusha, "Terapia" — 100,000 fusha, "Komplicimet" — 100,000 fusha etj. Ndryshe, mund tĂ« krijosh njĂ« DB nga mijĂ«ra tabela, secila pĂ«r njĂ« lloj tĂ« veçantĂ« pacienti (dhe ato mund tĂ« pĂ«rputhen!), trajtimi, barnash, dhe mijĂ«ra tabela tĂ« tjera pĂ«r lidhjet mes kĂ«tyre tabelave.

Globalet janë përshtatur në mënyrë të përsosur për mjekësinë, pasi lejojnë krijimin e një përshkrimi të saktë të historisë mjekësore për çdo pacient, terapive të ndryshme, veprimeve të barnave, në formën e një peme, pa e shpenzuar hapësirën e tepruar diskore në kolona të zbrazëta, siç do të ndodhte në rastin relational.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2Me globale, Ă«shtĂ« e lehtĂ« tĂ« krijosh njĂ« DB me tĂ« dhĂ«na pĂ«r njerĂ«zit,kur Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« grumbullosh dhe sistematizosh njĂ« maksimum informacioni tĂ« ndryshĂ«m pĂ«r klientin. Kjo Ă«shtĂ« e kĂ«rkuar nĂ« mjekĂ«si, bankar, marketing, arkivim dhe fusha tĂ« tjera.

.
Pa dyshim, në SQL gjithashtu mund të emulosh pemën me disa tabela (EAV, 1,2,3,4,5,6,7,8,9,10), por është shumë më e komplikuar dhe do të punojë më ngadalë. Në thelb do të duhet të shkruash një global që punon në tabela dhe të fshehësh të gjithë punën me tabelat pas një shtrese abstraksioni. Nuk është e drejtë të emulosh një teknologji më të ulët (globale) me mjete më të larta (SQL). Nuk është e arsyeshme.

Nuk është sekret që ndryshimi i skemës së të dhënave në tabela gjigante (ALTER TABLE) mund të marrë një kohë të konsiderueshme. MySQL, për shembull, bën ALTER TABLE ADD|DROP COLUMN duke kopjuar të gjitha informacionet nga tabela e vjetër në atë të re (kam testuar motorët MyISAM, InnoDB). Kjo mund të bllokojë një bazë pune me miliarda regjistrime për ditë, nëse nuk javë.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2Ndryshimi i strukturĂ«s sĂ« tĂ« dhĂ«nave, nĂ«se pĂ«rdorim globale, nuk na kushton asgjĂ«. NĂ« çdo moment mund tĂ« shtojmĂ« çdo pronĂ« tĂ« re qĂ« na nevojitet pĂ«r çdo objekt, nĂ« çdo nivel tĂ« hierarkisĂ«. Ndryshimet e lidhura me rinovimin e degĂ«ve mund tĂ« fillojnĂ« nĂ« mĂ«nyrĂ« tĂ« rregullt nĂ« DB e punĂ«s.


Prandaj, kur flasim për ruajtjen e objekteve me një numër të madh të pronave joobligative, globalet janë një zgjedhje e shkëlqyer.

Dhe, le të rikujtojmë, qasja në çdo pronë është e menjëhershme, pasi në globalet të gjitha rrugët përfaqësojnë B-tree.

Baza të dhënash në globale, në përgjithësi, janë një lloj DB-orientuar në dokumente, me mundësinë e ruajtjes të informacionit hierarkik. Prandaj, në fushën e ruajtjes së kartave mjekësore, globalet mund të konkurrojnë me DB-orientuara në dokumente. Por, sërish, kjo nuk është krejtësisht ajo.Merrni për krahasim, për shembull, MongoDB. Në këtë fushë, ajo humbet ndaj globaleve për arsye:

  1. Madhësia e dokumentit. Njësi e ruajtjes është teksti në format JSON (saktësisht BSON) me një madhësi maksimale rreth 16 MB. Ky kufizim është bërë që DB JSON të mos ngadalësohet gjatë analizimit, nëse ruan një dokument të madh JSON dhe më pas kërkon të dhëna përmes fushave. Në këtë dokument duhet të përqendrohet e gjithë informacioni për pacientin. Të gjithë e dimë se sa të trasha mund të jenë kartat e pacientëve. Madhësia maksimale e kartës në 16 MB menjëherë ndalon pacientët, për të cilët kartat e sëmundjeve përfshijnë skedarë MRI, skane radiografike dhe studime të tjera. Në një degë të globalit, ndryshe, mund të kesh informacion nga gigabajt deri në terabajt. Në parim, me këtë mund të ndalem, por do të vazhdoj.
  2. Koha e ndërgjegjes/ndryshimit/fshirjes së pronave të reja në kartën e pacientit. Kjo DB duhet të mbajë në memorie të gjithë hartën në tërësi (është një sasi e madhe!), të analizojë BSON, të shtojë/modifikojë/fshijë një nyjë të re, të përditësojë indekset, ta paketojë në BSON, dhe ta ruajë në disk. Ndërsa për globalin është e mjaftueshme të drejtohet vetëm te një pronë e caktuar dhe të bëjë manipulime me të.
  3. Shpejtësia e aksesit në prona të veçanta. Me shumë prona në dokument dhe strukturë të shumëfishtë, aksesimi i pronave të veçanta do të jetë më i shpejtë, sepse çdo rrugë në global është një B-tree. Në BSON, do të duhet të analizosh dokumentin në mënyrë lineare për të gjetur pronën e nevojshme.

3.3.2 Arrë asociative

Arrë asociative (edhe me arrë të ngjitur) përshtatet bukur me globalet. Për shembull, një arrë e tillë nga PHP do të shfaqet si në imazhin e parë 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 Dokumente hierarkike: XML, JSON

Gjithashtu ruhet lehtësisht në globalet. Për ruajtje mund të organizohet në mënyra të ndryshme.

XML
Mënyra më e thjeshtë për të organizuar XML në global është kur në nyje mbahen atributet e etiketave. Nëse do të jetë e nevojshme një akses i shpejtë në atributet e etiketave, mund t'i nxjerrim ata në degë të veçanta.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2

<note id="5">
<to>Vasja</to>
<from>Shkëlqimi</from>
<heading>Kujtesa</heading>
<body>Më telefononi nesër!</body>
</note>

Në COS, kjo do të korrespondojë me kodin:

Set ^xml("note")="id=5"
Set ^xml("note","to")="Sasha"
Set ^xml("note","from")="Sveta"
Set ^xml("note","heading")="Përkujtesë"
Set ^xml("note","body")="Më telefononi nesër!"

Shënim: Për XML, JSON, arrë asociative mund të krijohen shumë mënyra të ndryshme për të organizuar në global. Në këtë rast, ne nuk kemi reflektuar rendin e nyjeve të etiketave në etiketën note. Në global ^xml nyjet e ngjitura do të shfaqen në rend alfabetik. Për të reflektuar rregullisht rendin, mund të përdoret, për shembull, një organizim të tillë:

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2
JSON.
Në imazhin e parë nga seksi 3.3.1 është shfaqur reflektimi i këtij dokumenti JSON:

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

3.3.4 Strukturat e njëjta, lidhur me marrëdhënie hierarkike

Shembuj: struktura e zyra të shitjeve, vendosja e njerëzve në strukturën MLM, baza e debutimeve në shah.

Baza e debutimeve. Mund të përdorim vlerën e indekseve të nodit të globalit duke përdorur vlerësimin e forcës së lëvizjes. Atëherë, për të zgjedhur lëvizjen më të fuqishme, mjafton të zgjidhni degën me peshën më të madhe. Në global, të gjitha degët në çdo nivel do të jenë të renditura sipas forcës së lëvizjes.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2

Struktura e zyra të shitjeve, struktura e njerëzve në MLM. Në nyje mund të ruajmë vlera që mbështesin karakteristikat e të gjithë nënstrukturës. Për shembull, volumi i shitjeve të kësaj nënstrukturës. Në çdo moment, ne mund të marrim numrin që reflekton arritjet e çdo dege.

GlobalĂ«t — shpatujt e vĂ«rtetĂ« pĂ«r ruajtjen e tĂ« dhĂ«nave. PemĂ«t. Pjesa 2

4. Kur është më fitimprurëse të përdoren globalet

Në kolonën e parë janë paraqitur rastet kur do të keni një fitim të dukshëm në shpejtësi duke përdorur globalet, dhe në të dytën kur do të thjeshtohet zhvillimi ose modeli të dhënash.

Shpejtësia
Lehtësia e përpunimit/prezantimit të të dhënave

  1. Shtimi [me renditje automatike në çdo nivel], [indeksim sipas çelësit kryesor]
  2. Fshirja e nënstrukturave
  3. Objekte me shumë prona të ngjitura, për të cilat nevojitet qasje individuale
  4. Strukturë hierarkike me mundësi për të kaluar nëpër degët fëmijë nga çdo, madje edhe joekzistuese
  5. Kalimi nëpër nënstrukturat në thellësi
  1. Objekte/entitete me një numër të madh pronash/entitete që nuk janë obligative [dhe/ose të ngjitura]
  2. Të dhëna pa skema (schema-less). Kur pronat e reja mund të shfaqen dhe të zhduken shpesh.
  3. Duhet të krijoni një DB jo-standard.
  4. Baza e rrugëve dhe pemët e vendimeve. Kur rrugët janë lehtësisht të përfaqësuara në formë peme.
  5. Fshirja e strukturave hierarkike pa përdorimin e rekurzive

Vazhdim «Globalet — shpata magjike pĂ«r ruajtjen e tĂ« dhĂ«nave. ArrĂ« tĂ« hollĂ«. Pjesa 3».

Shënim ligjor: Ky artikull dhe komentet e mia për të janë mendimi im dhe nuk kanë lidhje me pozitat zyrtare të korporatës InterSystems.

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster