hierarchyid— odwołanie do metody typu danych
Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Database w usłudze Microsoft Fabric
Typ danych hierarchyid jest zmienną długością, typem danych systemowych. Użyj hierarchyid do reprezentowania pozycji w hierarchii. Kolumna typu hierarchyid nie reprezentuje automatycznie drzewa. Do aplikacji należy generowanie i przypisywanie wartości hierarchiiid w taki sposób, aby żądana relacja między wierszami była odzwierciedlana w wartościach.
Wartość hierarchyid typ danych reprezentuje pozycję w hierarchii drzewa. Wartości hierarchyid mają następujące właściwości:
- Bardzo kompaktowy
Średnia liczba bitów wymaganych do reprezentowania węzła w drzewie z n węzłów zależy od średniego fanoutu (średniej liczby elementów podrzędnych węzła). W przypadku małych wentylatorów (0–7) rozmiar wynosi około 6*logAn bitów, gdzie A jest średnim fanoutem. Węzeł w hierarchii organizacyjnej 100 000 osób ze średnim fanoutem 6 poziomów zajmuje około 38 bitów. Jest to zaokrąglane do 40 bitów lub 5 bajtów dla magazynu. - Porównanie jest w pierwszej kolejności
Biorąc pod uwagę dwie hierarchyid wartości i b, <b oznacza, że element następuje przed b w głębi pierwszego przechodzenia drzewa. Indeksy w hierarchii typy danych są w pierwszej kolejności, a węzły blisko siebie w głębi pierwszego przechodzenia są przechowywane w pobliżu siebie. Na przykład elementy podrzędne rekordu są przechowywane obok tego rekordu. Aby uzyskać więcej informacji, zobacz Hierarchical Data (SQL Server). - Obsługa dowolnych wstawiania i usuwania
Przy użyciu metody GetDescendant zawsze można wygenerować element równorzędny z prawej strony danego węzła, z lewej strony dowolnego węzła lub między dwoma elementami równorzędnymi. Właściwość porównania jest zachowywana, gdy dowolna liczba węzłów zostanie wstawiona lub usunięta z hierarchii. Większość wstawiania i usuwania zachowuje właściwość kompaktowania. Jednak wstawienie między dwoma węzłami spowoduje wygenerowanie wartości hierarchyid z nieco mniej kompaktowaną reprezentacją. - Kodowanie używane w hierarchii typu jest ograniczone do 892 bajtów. W związku z tym węzły, które mają zbyt wiele poziomów w ich reprezentacji, aby zmieściły się w 892 bajtach, nie mogą być reprezentowane przez typ hierarchyid.
Typ hierarchii jest dostępny dla klientów CLR jako typ danych SqlHierarchyId.
Uwagi
Hierarchyid typ logicznie koduje informacje o jednym węźle w drzewie hierarchii przez kodowanie ścieżki z katalogu głównego drzewa do węzła. Taka ścieżka jest logicznie reprezentowana jako sekwencja etykiet węzłów wszystkich elementów podrzędnych odwiedzanych po katalogu głównym. Ukośnik rozpoczyna reprezentację, a ścieżka, która odwiedza tylko katalog główny, jest reprezentowana przez pojedynczy ukośnik. W przypadku poziomów poniżej katalogu głównego każda etykieta jest kodowana jako sekwencja liczb całkowitych oddzielonych kropkami. Porównanie między elementami podrzędnymi odbywa się przez porównanie sekwencji liczb całkowitych rozdzielonych kropkami w kolejności słownika. Po każdym poziomie następuje ukośnik. Dlatego ukośnik oddziela rodziców od swoich dzieci. Na przykład następujące są prawidłowe hierarchyid ścieżek długości 1, 2, 2, 3 i 3 poziomów:
/
/1/
/0.3.-7/
/1/3/
/0.1/0.2/
Węzły można wstawić w dowolnej lokalizacji. Węzły wstawione po /1/2/ ale przed /1/3/ mogą być reprezentowane jako /1/2.5/. Węzły wstawione przed 0 mają logiczną reprezentację jako liczbę ujemną. Na przykład węzeł, który występuje przed /1/1/ może być reprezentowany jako /1/-1/. Węzły nie mogą mieć zer wiodących. Na przykład /1/1.1/ jest prawidłowa, ale /1/1.01/ jest nieprawidłowa. Aby zapobiec błędom, wstaw węzły przy użyciu metody GetDescendant.
Konwersja typu danych
Typ danych hierarchyid można przekonwertować na inne typy danych w następujący sposób:
- Użyj metody ToString(), aby przekonwertować wartość hierarchyid na reprezentację logiczną jako nvarchar(4000) typu danych.
- Użyj
odczytu () izapisu () () , aby przekonwertować hierarchiina varbinary . - Aby przesyłać hierarchyid parametry za pomocą protokołu SOAP najpierw rzutować je jako ciągi.
Uaktualnianie baz danych
Po uaktualnieniu bazy danych do nowszej wersji programu SQL Server zostanie automatycznie zainstalowany nowy zestaw i hierarchyid typ danych. Reguły uaktualniania klasyfikatora wykrywają dowolny typ użytkownika lub zestawy z nazwami powodującymi konflikty. Doradca uaktualnienia zaleci zmianę nazwy dowolnego zestawu powodującego konflikt i zmianę nazwy dowolnego typu powodującego konflikt lub użycie dwuczęściowych nazw w kodzie w celu odwoływania się do istniejącego typu użytkownika.
Jeśli uaktualnienie bazy danych wykryje zestaw użytkownika z nazwą powodującą konflikt, automatycznie zmieni nazwę tego zestawu i umieści bazę danych w trybie podejrzanego.
Jeśli typ użytkownika o nazwie powodującej konflikt istnieje podczas uaktualniania, nie są podejmowane żadne specjalne kroki. Po uaktualnieniu zarówno stary typ użytkownika, jak i nowy typ systemu, będą istnieć. Typ użytkownika będzie dostępny tylko za pośrednictwem nazw dwuczęściowych.
Używanie kolumn hierarchyid w replikowanych tabelach
Kolumny typu hierarchyid mogą być używane w dowolnej zreplikowanej tabeli. Wymagania aplikacji zależą od tego, czy replikacja jest jednokierunkowa, czy dwukierunkowa, oraz od używanych wersji programu SQL Server.
Replikacja jednokierunkowa
Replikacja jednokierunkowa obejmuje replikację migawki, replikację transakcyjną i replikację scalania, w której zmiany nie są wprowadzane na subskrybenta. Jak hierarchyid kolumny działają z jedną replikacją kierunkowa zależy od wersji programu SQL Server, na której działa subskrybent.
- Program SQL Server Publisher może replikować kolumny hierarchii do subskrybenta programu SQL Server tej samej wersji bez żadnych specjalnych zagadnień.
- Program SQL Server Publisher musi konwertować kolumny hierarchii , aby replikować je do subskrybenta z uruchomionym programem SQL Server Compact lub starszą wersją programu SQL Server. Program SQL Server Compact i starsze wersje programu SQL Server nie obsługują kolumn hierarchiiid. Jeśli używasz jednej z tych wersji, nadal możesz replikować dane do subskrybenta. W tym celu należy ustawić opcję schematu lub poziom zgodności publikacji (na potrzeby replikacji scalania), aby można było przekonwertować kolumnę na zgodny typ danych.
Filtrowanie kolumn jest obsługiwane w obu tych scenariuszach. Obejmuje to filtrowanie kolumn hierarchii. Filtrowanie wierszy jest obsługiwane, o ile filtr nie zawiera kolumny hierarchyid.
Replikacja dwukierunkowa
Replikacja dwukierunkowa obejmuje replikację transakcyjną z aktualizowaniem subskrypcji, replikacją transakcyjną komunikacji równorzędnej i replikacją scalania, w której zmiany są wprowadzane na subskrybenta. Replikacja umożliwia skonfigurowanie tabeli z kolumnami hierarchiiid na potrzeby replikacji dwukierunkowej. Zwróć uwagę na następujące wymagania i zagadnienia.
- Program Publisher i wszyscy subskrybenci muszą mieć uruchomioną tę samą wersję programu SQL Server 2016 (13.x) lub nowszą.
- Replikacja replikuje dane jako bajty i nie wykonuje żadnej walidacji w celu zapewnienia integralności hierarchii.
- Hierarchia zmian wprowadzonych w źródle (subskrybent lub wydawca) nie jest zachowywana podczas replikacji do miejsca docelowego.
- Wartości skrótu dla hierarchyid kolumny są specyficzne dla bazy danych, w której są generowane. W związku z tym tę samą wartość można wygenerować dla wydawcy i subskrybenta, ale można ją zastosować do różnych wierszy. Replikacja nie sprawdza tego warunku i nie ma wbudowanego sposobu partycjonowania hierarchyid wartości kolumn, ponieważ istnieją kolumny IDENTITY. Aplikacje muszą używać ograniczeń lub innych mechanizmów, aby uniknąć takich niewykrytych konfliktów.
- Istnieje możliwość, że wiersze wstawione na subskrybenta będą oddzielone. Wiersz nadrzędny wstawionego wiersza mógł zostać usunięty w programie Publisher. Powoduje to niezkryty konflikt, gdy wiersz z subskrybenta zostanie wstawiony w programie Publisher.
- Filtry kolumn nie mogą odfiltrować kolumn hierarchicznych bez wartości null: wstawianie z subskrybenta zakończy się niepowodzeniem, ponieważ nie ma wartości domyślnej dla kolumny hierarchyid w programie Publisher.
- Filtrowanie wierszy jest obsługiwane, o ile filtr nie zawiera kolumny hierarchyid.
Zobacz też
danych hierarchicznych (SQL Server)
hierarchyid odwołanie do metody typu danych