Istoricul ORDPATH în SQL Server
Tip de date ierarhică
Formarea unei ierarhii (atribuirea de coduri nodurilor noi)
Identificarea valorilor ierarhice
Întrebări tipice datelor ierarhice
Istoricul ORDPATH în SQL Server
- Ierarhia este păstrată și citită în întregime.
- Aplicația are nevoie de aceste date în format XML.
- Căutările pentru datele de documente XML sunt rareori efectuate și nu sunt critice în timp.
Pentru a nu parsa un document XML de fiecare dată când trebuie să găsiți ceva în el, se intenționează indexul primar XML. Când creați un astfel de index, documentul XML este stocat în baza de date într-o formă relațională convenabilă, care vă permite să efectuați o căutare mai eficientă a acestuia. Pentru a reprezenta ierarhia elementelor, acest index folosește schema ORDPATH (ORDPATH - schema de etichetare ierarhică). Această abordare sa dovedit a fi mai eficientă în acest caz decât tradiționalul "părinte / copil".
Tip de date ierarhică
Forma de mai sus a scrie valorile Ierarhiei este logică. Deci valorile HierarchyId sunt convertite în tipuri de caractere și înapoi. Într-o formă binară, valorile tipului HierarchyId sunt stocate foarte compact.
Ce este atât de remarcabil în această schemă de atribuire a codurilor la noduri (schema ORDPATH)?
- Folosind această schemă, puteți oricând să adăugați un nou nod în orice loc din ierarhie, fără a schimba nodurile existente.
- Informațiile despre toate nodurile părinte (de la părintele imediat la nodul rădăcină) sunt prezente în codul nodului.
- Este ușor să identificați toate nodurile copilului (nu doar descendenții imediați).
- Schema stochează informații nu numai despre relația părinte / copil, ci și despre ordinea nodurilor (nodul / 1/1 / merge înaintea nodului / 1/2 /).
- Sortarea după coloana HierarchyId construiește nodurile din ierarhie (rândurile tabelului) în ordinea "dreapta".
Formarea unei ierarhii (atribuirea de coduri nodurilor noi)
Înainte de a înțelege cum se formează noi coduri de noduri atunci când acestea sunt adăugate la ierarhie, să creăm o etichetă de testare care să stocheze ierarhia noastră:
Să ne amintim că o logică (textuală) sub formă HierarchyId valori reprezintă o listă de numere de toate nodurile de pe calea de la rădăcina ierarhiei la un anumit nod, delimitat cu „/“. Fiecare nod constă dintr-un număr de una sau mai multe componente (numere) separate prin „“ (Dot). Un exemplu de valori Valorile Ierarhice valide:
Codificarea fizică a valorilor HierarchyId trebuie să îndeplinească în mod evident următoarele cerințe:
- Ar trebui să fie cât mai compact posibil.
- Acesta ar trebui să ofere „dreptul“ valorile HierarchyId ordine de sortare (care este, de exemplu, valoarea /0.1/0.2/ trebuie să fie mai mare decât valoarea /0.1/0/).
Aceasta este, de exemplu, valoarea lui / 7 / 4.5 / este codificată în conformitate cu această schemă după cum urmează:
Fiecare componentă a numărului de noduri este alcătuită din două părți - codul intervalului și valoarea reală. Tabelul 1 prezintă toate intervalele utilizate de serverul SQL. De exemplu, dacă doriți să codificați valoarea 11, atunci conform tabelului, intervalul 8-15 va fi utilizat și, în consecință, reprezentarea binară a acestei componente va fi:
101 / * cod din gama 8-15 * /
011 / * valoare convertită la începutul intervalului (11 - 8 = 3) * /
Evident, secvențele de biți care codifică valorile HierarchyId au o lungime variabilă. Și lungimea lor nu este neapărat un multiplu de opt biți (limite octet). Deci, cum stabilești lungimea valorii lui HierarchyId? Steagul de biți al tranziției către noul nivel din ultima componentă a ultimului număr de nod este întotdeauna egal cu unul. Mai mult, secvența de biți este căptușită cu zerouri la limita octeților. În consecință, pentru a găsi adevărata lungime a valorii lui HierarchyId în biți, trebuie doar să găsești primul un bit egal cu cel al ultimului octet - acesta este sfârșitul secvenței.
Să ne amintim de cerința de a sorta "corect" valorile HierarchyId. Conform acestei cerințe, de exemplu, valoarea lui / 1 / ar trebui să fie mai mică decât valoarea lui /1.1/. Dar dacă codificați aceste valori:
atunci această condiție nu va fi îndeplinită, deoarece primele componente ale numerelor de noduri sunt egale, iar mai departe în prima valoare este o unitate, iar în al doilea - zero (pavilionul trecerii la un nou nivel). Se pare că a doua valoare este mai mică decât prima și acest lucru este greșit. Pentru a rezolva această problemă, valorile tuturor nodurilor care nu au trecut în nivelul lor au încă o dată valorile componentelor numărului de noduri. Adică valorile noastre vor fi codate după cum urmează:
Deci, să punem totul împreună. Să încercăm să codificăm o valoare și apoi să ne comparăm rezultatul cu ceea ce va reveni serverul SQL. Să fie valoarea lui /5.11 / 3 /
- Scriem componentele secvenței de biți: