
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 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 atomarNë 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.

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:
- simbolet ndarëse.
Set ^t(id1) = "col11/col21/col31" Set ^t(id2) = "col12/col22/col32" - një skemë të fortë, ku çdo fushë zë një numër të paracaktuar bajtash. Siç bëhet në DB-të relacionale.
- 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) = 1Tani 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
TCOMMITDetaje se si të bëjmë në M , .
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.
Në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.
Në 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
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
Sigurisht, 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
- Më të ngadalshëm për insertim, pasi duhet të vendosim numrin e nodave të barabartë me numrin e kolonave.
- 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.
- 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.
- Më e lehtë për të ndryshuar skemën e të dhënave
- 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

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.
Me 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 (, ,,,,,,,,,), 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ë.
Ndryshimi 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:
- 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.
- 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ë.
- 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.

<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ë:

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.

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.

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