Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Obsługa danych hierarchicznych

Termin Definicja
Obsługa danych hierarchicznych

Obsługa danych hierarchicznych to typ hierarchyid i funkcje pozwalające reprezentować struktury drzewiaste.

Model danych typu hierarchyid w SQL Server

hierarchyid to systemowy typ danych Microsoft SQL Server przeznaczony do przechowywania pozycji elementu w hierarchii, na przykład relacji katalog–podkatalog, kategorii–podkategorii albo struktury organizacyjnej. Wartość nie przechowuje całego rekordu ani nazwy elementu, lecz jego położenie względem korzenia. Typową reprezentacją tekstową jest ścieżka złożona z poziomów oddzielonych ukośnikami, na przykład /1/, /1/3/ i /1/3/2/. W tym przykładzie /1/ jest przodkiem /1/3/, a /1/3/2/ jest elementem zagnieżdżonym pod /1/3/.

Kolumna hierarchyid powinna być używana razem z innymi kolumnami opisującymi obiekt, na przykład identyfikatorem, nazwą i typem elementu. Sam typ nie przechowuje nazwy folderu, kategorii czy urządzenia. Korzeń można oznaczyć wartością /, a jego bezpośrednie dzieci otrzymują ścieżki takie jak /1/ i /2/. Wartości są porównywane w kolejności hierarchicznej, dlatego sortowanie po kolumnie hierarchyid zwykle grupuje elementy z ich poddrzewami. Nie jest to jednak zwykły licznik ani klasyczny klucz obcy wskazujący na rekord rodzica.

Metody odczytu relacji między węzłami

SQL Server udostępnia metody instancji i funkcje związane z hierarchyid, które pozwalają analizować strukturę bez ręcznego dzielenia tekstowej ścieżki. GetLevel() zwraca poziom elementu: korzeń ma poziom zero, jego dzieci poziom jeden, a kolejne zagnieżdżenia odpowiednio wyższe. GetAncestor(n) zwraca przodka oddalonego o n poziomów. Dla przykładu wywołanie GetAncestor(1) dla wartości /1/3/2/ zwraca /1/3/.

Metoda IsDescendantOf() sprawdza, czy wskazana wartość znajduje się w poddrzewie danego węzła. Pozwala to rozróżnić relację przodek–potomek od zwykłego porównania identyfikatorów. Metody Parse() i ToString() służą do konwersji między zapisem tekstowym a wartością typu hierarchyid. SQL Server udostępnia także GetReparentedValue(), które pomaga obliczyć nową ścieżkę po przeniesieniu elementu wraz z poddrzewem pod innego rodzica. Przy takiej operacji trzeba zaktualizować wszystkie elementy należące do przenoszonego poddrzewa, a nie tylko rekord najwyższego poziomu.

Dodawanie dzieci, kolejność rodzeństwa i indeksowanie

Do wyznaczania pozycji nowego dziecka służy GetDescendant(). Metoda przyjmuje opcjonalnego poprzedniego i następnego sąsiada tego samego rodzica i może wygenerować wartość umieszczoną pomiędzy nimi. Dzięki temu można dodać element pomiędzy istniejące rodzeństwo bez przebudowywania całej hierarchii. Gdy oba argumenty są puste, metoda może utworzyć pierwszego potomka. Wynik należy zapisać w kolumnie i odpowiednio obsłużyć równoczesne operacje, ponieważ sama metoda nie zastępuje mechanizmu blokad, transakcji ani ograniczenia unikalności.

Wartość hierarchyid ma zmienny rozmiar, a maksymalna długość reprezentacji wewnętrznej wynosi 892 bajty. Przy bardzo głębokich strukturach albo przy wielokrotnym wstawianiu elementów pomiędzy te same wartości rozmiar etykiet może rosnąć, dlatego model trzeba testować na danych zbliżonych do rzeczywistych. Dla zapytań wyszukujących całe poddrzewo można wykorzystać warunek oparty na IsDescendantOf() albo zakres wynikający z uporządkowania wartości hierarchicznych. Indeks na kolumnie hierarchyid może przyspieszyć sortowanie i wyszukiwanie, ale nie gwarantuje poprawności logicznej drzewa. W praktyce warto dodatkowo kontrolować unikalność ścieżek oraz istnienie rodzica.

Kontrola spójności podczas pracy z hierarchią

hierarchyid nie narzuca automatycznie wszystkich reguł drzewa. Baza może przechowywać wiersz z wartością wskazującą na rodzica, którego rekord nie istnieje, jeżeli aplikacja lub procedura składowana nie sprawdzi tego przed zapisem. Typ nie zapobiega również wszystkim błędom wynikającym z nieprawidłowego przenoszenia poddrzewa. Dlatego operacje dodawania, usuwania i zmiany rodzica powinny być wykonywane w transakcjach, z kontrolą konfliktów oraz z testami obejmującymi korzeń, liście, głębokie gałęzie i jednoczesne modyfikacje.

Podczas diagnostyki problemu należy porównać wartości ścieżek, poziomy zwracane przez GetLevel(), relacje ustalane przez IsDescendantOf() oraz rekordy opisujące rodziców i dzieci. Warto sprawdzić, czy zapytanie filtruje całe poddrzewo, czy tylko bezpośrednie dzieci, oraz czy sortowanie odpowiada oczekiwanej kolejności rodzeństwa. W środowisku z laptopem lub komputerem PC analiza takiej struktury sprowadza się zwykle do sprawdzenia działania konkretnej aplikacji, połączenia z SQL Server, poprawności zapytań i integralności zapisanych danych. Naprawa powinna obejmować rzeczywistą przyczynę, na przykład błędną transakcję, brak indeksu, nieprawidłową konwersję ścieżki albo niepełną aktualizację przenoszonego poddrzewa.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę