Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2Ufänken - kuckt Deel 1.

3. Varianten vun Strukturen wann globals benotzt

Eng Struktur wéi e bestallte Bam huet verschidde speziell Fäll. Loosst eis déi betruechten déi praktesch Wäert hunn wann Dir mat Globale schafft.

3.1 Special Fall 1. One Node ouni Branchen


Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2Globale kënnen net nëmme wéi eng Array benotzt ginn, awer och wéi regelméisseg Variablen. Zum Beispill, als Konter:

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

An dësem Fall kann de globale, nieft senger Bedeitung, och Filialen hunn. Dat eent schléisst dat anert net aus.

3.2 Besonnesch Fall 2. Ee Vertex a vill Branchen

Am Allgemengen ass dëst eng klassesch Schlësselwäertbasis. A wa mir en Tupel vu Wäerter als Wäert späicheren, kréie mir e ganz gewéinlechen Dësch mat engem primäre Schlëssel.

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2

Fir eng Tabell iwwer Globalen ëmzesetzen, musse mir selwer Reihen aus de Kolonnwäerter generéieren, an dann op d'Global späicheren mat dem primäre Schlëssel. Fir et méiglech ze maachen, de String erëm a Kolonnen ze deelen beim Liesen, kënnt Dir benotzen:

  1. delimiter Zeechen.
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. e steife Schema an deem all Feld eng virbestëmmte Zuel vu Bytes besetzt. Wéi et an relational Datenbanken gemaach gëtt.
  3. eng speziell Funktioun $LB (verfügbar am Cache), déi eng String vu Wäerter erstellt.
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

Interessanterweis ass et net schwéier Globale ze benotzen fir eppes ähnlech wéi sekundär Indexen a relationalen Datenbanken ze maachen. Loosst eis esou Strukturen Index Globale nennen. En Index global ass en Hëllefsbaum fir séier Felder ze sichen déi net Deel vum primäre Schlëssel vun der Haaptglobal sinn. Fir et auszefëllen an ze benotzen, musst Dir zousätzlech Code schreiwen.

Loosst eis en Index global op der éischter Kolonn erstellen.

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

Elo, fir séier no Informatioun an der éischter Kolonn ze sichen, musse mir an d'global kucken ^i a fannen déi primär Schlësselen (ID) entspriechend dem gewënschten Wäert vun der éischter Kolonn.

Wann Dir e Wäert asetzt, kënne mir direkt souwuel de Wäert wéi och den Indexglobal fir déi erfuerderlech Felder erstellen. A fir Zouverlässegkeet, loosst eis alles an enger Transaktioun wéckelen.

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

Detailer iwwer wéi et op M Dëscher op globalen, Emulatioun vun sekundären Indexen.

Esou Dëscher funktionnéieren esou séier wéi an traditionellen Datenbanken (oder nach méi séier) wann d'Funktioune fir d'Insertéieren / Aktualiséierung / Läschen Reihen an COS / M geschriwwe sinn a kompiléiert sinn.Ech hunn dës Ausso mat Tester iwwer Bulk INSERT a SELECT an eng zwee-Kolonn Tabelle gepréift, dorënner d'TSTART an TCOMMIT Kommandoen (Transaktiounen).

Ech hunn net méi komplex Szenarie mat concurrent Zougang a parallel Transaktiounen getest.

Ouni Transaktiounen ze benotzen, war den Insertrate 778 Inserts / Sekonn pro Millioun Wäerter.
Mat 300 Millioune Wäerter - 422 Inserts / Sekonn.

Wann Dir Transaktiounen benotzt - 572 Inserts / Sekonn fir 082M Inserts. All Operatioune goufen aus kompiléierten M Code gemaach.
Festplacke si regelméisseg, net SSD. RAID5 mat Schreifweis. Phenom II 1100T Prozessor.

Fir eng SQL Datebank op eng ähnlech Manéier ze testen, musst Dir eng gespäichert Prozedur schreiwen déi Insertiounen an enger Loop ausféiert. Wann Dir MySQL 5.5 (InnoDB-Speicherung) testen, dës Method benotzt hunn ech Zuelen net méi wéi 11K Inserts pro Sekonn kritt.
Jo, d'Ëmsetzung vun Dëscher op Globale gesäit méi komplex aus wéi an relational Datenbanken. Dofir hunn industriell Datenbanken op Globalen SQL Zougang fir d'Aarbecht mat Tabulardaten ze vereinfachen.

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2Am Allgemengen, wann d'Dateschema net dacks ännert, ass d'Insertiounsgeschwindegkeet net kritesch an d'ganz Datebank kann einfach a Form vun normaliséierten Dëscher vertruede ginn, dann ass et méi einfach mat SQL ze schaffen, well et e méi héijen Abstraktiounsniveau bitt .

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2An dësem spezielle Fall wollt ech dat weisen Globale kënnen als Konstruktor handelen fir aner Datenbanken ze kreéieren. Wéi en Assembler an deem aner Sprooche geschriwwe kënne ginn. Hei sinn Beispiller wéi Dir Analoga op Globalen erstellt Schlësselwäert, Lëschten, Sets, Tabulär, Dokumentorientéiert Datenbanken.

Wann Dir eng Aart vun net-Standard-Datebank mat minimalem Effort maache musst, da sollt Dir op Globale kucken.

3.3 Spezialfall 3. Zwee-Niveau Bam, all Node vum zweeten Niveau huet eng fix Zuel vu Branchen

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2Dir hutt et wahrscheinlech virgestallt: dëst ass eng alternativ Ëmsetzung vun Tabellen op Globalen. Loosst eis dës Ëmsetzung mat der viregter vergläichen.

Dëscher op engem zwee-Niveau Bam vs. op engem eenzege Bam.

Минусы
Plus

  1. Méi lues fir d'Insertioun, well Dir musst d'Zuel vun de Wirbelen gläich wéi d'Zuel vun de Sailen setzen.
  2. Méi Disk Space Konsum. Zënter global Indizes (als Array-Index versteet) mat Kolonnennamen huelen Disk Space op a gi fir all Zeil duplizéiert.

  1. Méi séier Zougang zu de Wäerter vun eenzelne Spalten, well et net néideg ass d'String ze analyséieren. Laut mengen Tester ass et 11,5% méi séier op 2 Säulen a méi op enger méi grousser Zuel vu Säulen.
  2. Méi einfach Dateschema z'änneren
  3. Méi kloer Code

Fazit: net fir jiddereen. Zënter Geschwindegkeet ass ee vun de wichtegste Virdeeler vun de Globalen, ass et wéineg Sënn fir dës Implementatioun ze benotzen, well et wäert héchstwahrscheinlech net méi séier Leeschtunge wéi Tabellen a relational Datenbanken.

3.4 Allgemeng Fall. Beem an bestallt Beem

All Datestruktur, déi als Bam vertruede ka ginn, passt perfekt mat Globalen.

3.4.1 Objete mat subobjekter

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2

Dëst ass de Beräich vun der traditioneller Notzung vu Globalen. Am medizinesche Beräich gëtt et eng grouss Zuel vu Krankheeten, Medikamenter, Symptomer a Behandlungsmethoden. Et ass irrational en Dësch mat enger Millioun Felder fir all Patient ze kreéieren. Ausserdeem wäerten 99% vun de Felder eidel sinn.

Stellt Iech eng SQL Datebank vun Dëscher vir: "Patient" ~ 100 Felder, "Medizin" - 000 Felder, "Therapie" - 100 Felder, "Komplikatiounen" - 000 Felder, etc. a sou weider. Oder Dir kënnt eng Datebank vu villen Dausende vun Dëscher erstellen, jidderee fir eng spezifesch Zort Patient (a si kënnen iwwerlappen!), Behandlungen, Medikamenter an Dausende méi Dëscher fir Verbindungen tëscht dësen Dëscher.

Globale sinn ideal fir Medizin, well se Iech erlaben fir all Patient eng genee Beschreiwung vu senger medizinescher Geschicht, verschiddenen Therapien, an d'Aktioune vun de Medikamenter, a Form vun engem Bam ze kreéieren, ouni extra Plaatz op eidel Sailen ze verschwenden, sou wéi de Fall an engem relational Fall sinn.

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2Mat Hëllef vu Globalen ass et bequem eng Datebank mat Daten iwwer Leit ze kreéieren, wann et wichteg ass e Maximum vu verschiddenen Informatioun iwwer de Client ze sammelen an ze systematiséieren. Dëst ass gefrot an der Medizin, Banken, Marketing, Archivéieren an aner Beräicher

.
Natierlech kënnt Dir an SQL och e Bam mat nëmmen e puer Dëscher emuléieren (EAV, 1,2,3,4,5,6,7,8,9,10), awer dëst ass däitlech méi komplizéiert a wäert méi lues sinn. Wesentlech musst Dir e Global schreiwen deen op Dëscher funktionnéiert an all d'Aarbecht mat Dëscher ënner enger Abstraktiounsschicht verstoppt. Et ass falsch fir méi niddereg-Niveau Technologie (globals) ze emuléieren mat héijer Niveau Technologie (SQL). Onpassend.

Et ass kee Geheimnis datt d'Ännerung vum Dateschema op riesegen Dëscher (ALTER TABLE) eng zimlech Zäit daueren kann. MySQL, zum Beispill, mécht ALTER TABLE ADD|DROP COLUMN andeems Dir Informatioun vun der aler Tabell op déi nei Tabell komplett kopéiert (getest MyISAM, InnoDB Motoren). Wat fir Deeg, wann net Wochen, eng Aarbechtsdatebank mat Milliarden Opzeechnunge kann ophänken.

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2D'Datestruktur änneren wa mir Globale benotzen kascht eis näischt. Zu all Moment kënne mir all nei Eegeschafte bäidroen, déi mir brauchen fir all Objet, op all Niveau vun der Hierarchie. Ännerungen, déi mam Numm ëmbenennen, kënnen am Hannergrond op enger lafender Datebank lafen.


Dofir, wann et ëm d'Späichere vun Objete mat enger riseger Unzuel vun fakultativen Eegeschafte kënnt, sinn d'Globaler eng super Wiel.

Ausserdeem, loosst mech Iech drun erënneren datt den Zougang zu enger vun den Eegeschafte direkt ass, well am Globale sinn all Weeër B-Beem.

Global Datenbanken, am Allgemengen, sinn eng Aart vun dokumentorientéierter Datebank mat der Fäegkeet hierarchesch Informatioun ze späicheren. Dofir kënnen dokumentorientéiert Datenbanken mat Globale konkurréiere am Beräich vun der Medizinesch records ze späicheren. Awer et ass nach ëmmer net ganz d'selwechtLoosst eis MongoDB fir de Verglach huelen. An dësem Domain et verléiert d'Global aus de folgende Grënn:

  1. Dokument Gréisst. D'Späichereenheet ass Text am JSON-Format (méi präzis BSON) mat engem maximale Volume vun ongeféier 16MB. D'Restriktioun gouf speziell gemaach fir datt d'JSON-Datebank net beim Parsing verlangsamt gëtt, wann e risegt JSON-Dokument dran gespäichert ass an dann duerch Felder zougänglech ass. Dëst Dokument soll all Informatioun iwwer de Patient enthalen. Mir all wëssen wéi déck Patient records kënne sinn. Déi maximal Kaartgréisst vun 16MB mécht direkt en Enn fir Patienten, deenen hir Krankheetskaart MRI-Dateien, Röntgenscannen an aner Studien enthält. An enger Branche vum Globale kënnt Dir Gigabytes an Terabytes vun Informatioun hunn. Am Prinzip kënne mir dat ophalen, mee ech wäert weidergoen.
  2. Zäit vum Bewosstsinn / Ännerung / Läschen vun neien Eegeschaften am Diagramm vum Patient. Sou eng Datebank muss déi ganz Kaart an d'Erënnerung liesen (dëst ass e grousse Betrag!), BSON parséieren, en neien Node addéieren / änneren / läschen, Indexen aktualiséieren, se an BSON packen, a späicheren et op Disk. E Global brauch nëmmen Zougang zu enger spezifescher Immobilie ze kréien an se ze manipuléieren.
  3. Schnell Zougang zu eenzel Eegeschafte. Mat villen Eegeschaften an engem Dokument a senger Multi-Level Struktur wäert den Zougang zu eenzelne Properties méi séier sinn wéinst der Tatsaach, datt all Wee am Global e B-Bam ass. Am BSON musst Dir d'Dokument linear parséieren fir déi gewënscht Eegeschafte ze fannen.

3.3.2 Associativ Arrays

Associativ Arrays (och mat nestéierten Arrays) passen perfekt op Globalen. Zum Beispill gëtt esou eng Array vu PHP am éischte Bild 3.3.1 ugewisen.

$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 Hierarchesch Dokumenter: XML, JSON

Och einfach a globalen gespäichert. Kann op verschidde Manéiere fir d'Lagerung geluecht ginn.

XML
Deen einfachste Wee fir XML a Globalen ze parséieren ass Tag Attributer an Noden ze späicheren. A wa séier Zougang zu Tag Attributer néideg ass, da kënne mir se an getrennte Filialen plënneren.

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2

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

Op COS géif dëst dem Code entspriechen:

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

Kommentéieren: Fir XML, JSON, assoziativ Arrays, kënnt Dir mat ville verschiddene Weeër kommen fir op Globalen ze weisen. An dësem Fall hu mir d'Uerdnung vun den Ënnertags am Notiztag net reflektéiert. Globalt ^ xml subtags ginn an alphabetesch Uerdnung ugewisen. Fir d'Bestellung strikt ze reflektéieren, kënnt Dir zum Beispill de folgenden Display benotzen:

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2
JSON.
Déi éischt Bild aus Sektioun 3.3.1 weist eng Reflexioun vun dësem JSON Dokument:

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

3.3.4 Identesch Strukturen, déi duerch hierarchesch Bezéiungen verbonne sinn

Beispiller: d'Struktur vun de Verkafsbüroen, d'Plaz vun de Leit an enger MLM Struktur, d'Datebank vun Ouvertureszäiten am Schach.

Debutéiert Datebank. Dir kënnt d'Schlagkraaftschätzung als Indexwäert vum globalen Node benotzen. Dann, fir de stäerkste Beweegung ze wielen, ass et genuch fir d'Branche mat dem gréisste Gewiicht ze wielen. Am Globale ginn all Filialen op all Niveau no Beweegungsstäerkt zortéiert.

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2

D'Struktur vun de Verkafsbüroen, d'Struktur vun de Leit am MLM. Node kënne gewësse Cachingwäerter späicheren, déi d'Charakteristike vum ganze Subtree reflektéieren. Zum Beispill, de Verkafsvolumen vun engem bestëmmte Subtree. Zu all Moment kënne mir eng Figur kréien, déi d'Leeschtunge vun all Branche reflektéiert.

Globale si Schatzschwerter fir Daten ze späicheren. Beem. Deel 2

4. A wéi enge Fäll ass et am meeschte gënschteg fir Globalen ze benotzen?

Déi éischt Kolonn presentéiert Fäll wou Dir e bedeitende Geschwindegkeetsgewënn kritt andeems Dir Globalen benotzt, an déi zweet wann den Design oder den Datemodell vereinfacht gëtt.

Speed
Einfachheet vun Daten Veraarbechtung / Presentatioun

  1. Insertion [mat automatescher Sortéierung op all Niveau], [Indexéiere mam Masterschlëssel]
  2. Ewechzehuelen subtrees
  3. Objekter mat vill nestéierten Eegeschaften déi individuell Zougang erfuerderen
  4. Hierarchesch Struktur mat der Fäegkeet fir Kannerzweige vun all Branche ëmzegoen, och net existéierend
  5. Déift-éischt Traversal vun subtrees
  1. Objekter / Entitéite mat enger riesecher Unzuel vun fakultativen [an / oder nestet] Eegeschafte / Entitéiten
  2. Schema-manner Daten. Wann nei Eegeschafte kënnen dacks optrieden an al verschwannen.
  3. Dir musst eng personaliséiert Datebank erstellen.
  4. Wee Basen an Decisioun Beem. Wann et bequem ass Weeër als Bam ze representéieren.
  5. Hierarchesch Strukturen ewechhuelen ouni Rekursioun ze benotzen

Fortsetzung "Globaler si Schatzschwerter fir Daten ze späicheren. Spuer Arrays. Deel 3".

Verzichterklärung: Dësen Artikel a meng Kommentaren dozou sinn meng Meenung an hu keng Relatioun zu der offizieller Positioun vun InterSystems Corporation.

Source: will.com

Setzt e Commentaire