Udostępnij za pomocą


hierarchyid— odwołanie do metody typu danych

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL 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 hierarchyid w taki sposób, aby żądana relacja między wierszami została odzwierciedlona 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łami 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 * logA n bitów, gdzie A jest średnim fanoutem. Węzeł w hierarchii organizacyjnej 100 000 osób ze średnim fanoutem sześciu 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 wartości ab, a<b oznacza, że element wystę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 Dane hierarchiczne (SQL Server).

  • Obsługa dowolnych wstawiania i usuwania: przy użyciu metody GetDescendant zawsze można wygenerować element równorzędny po prawej stronie danego węzła, po lewej stronie danego 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 wstawienia między dwoma węzłami generują wartości hierarchyid z nieco mniej kompaktowaną reprezentacją.

  • Kodowanie jest ograniczone do 892 bajtów: Dlatego węzły, które mają zbyt wiele poziomów w ich reprezentacji, aby zmieścić się w 892 bajtach, nie mogą być reprezentowane przez typ hierarchyid .

Typ hierarchyid jest dostępny dla klientów środowiska uruchomieniowego języka wspólnego (CLR) jako SqlHierarchyId typu danych.

Remarks

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/ może być reprezentowane jako /1/2.5/. Węzły wstawione przed 0 utworzeniem reprezentacji logicznej jako liczby ujemnej. Na przykład węzeł, który występuje wcześniej /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łowy, ale /1/1.01/ nie jest prawidłowy. 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 typ danych nvarchar(4000).

  • Użyj funkcji Odczyt (aparat bazy danych) przy użyciu języka CSharp i zapisu , aby przekonwertować hierarchyid na wartość varbinary.

  • Aby przesyłać parametry hierarchyid za pośrednictwem protokołu SOAP, najpierw rzutuj je jako ciągi.

Uaktualnianie baz danych

Po uaktualnieniu bazy danych do nowszej wersji programu SQL Server nowy zestaw i typ danych hierarchyid są instalowane automatycznie. Reguły uaktualniania klasyfikatora wykrywają dowolny typ użytkownika lub zestawy z nazwami powodującymi konflikty. Doradca uaktualnienia zaleca 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 zmienia nazwę tego zestawu i umieszcza 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 istnieją. Typ użytkownika jest 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 hierarchyid , 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 hierarchyid . 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 tak długo, jak 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ć tę samą wersję w programie SQL Server 2016 (13.x) lub nowszej wersji.

  • 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 kolumn hierarchyid mogą mieć identyczne reprezentacje binarne we wszystkich bazach danych. Konflikty mogą wystąpić w replikacji dwukierunkowej, gdy logika aplikacji niezależnie generuje ten sam identyfikator hierarchii dla różnych jednostek. 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 wartości kolumn hierarchiiid , ponieważ istnieją IDENTITY kolumny. Aplikacje muszą używać ograniczeń lub innych mechanizmów, aby uniknąć takich niewykrytych konfliktów.

  • Istnieje możliwość, że wiersze wstawione na subskrybenta mogą być oddzielone. Wiersz nadrzędny wstawionego wiersza może zostać usunięty w programie Publisher. Powoduje to niezkryty konflikt, gdy wiersz z subskrybenta zostanie wstawiony w programie Publisher.

  • Filtry kolumn nie mogą filtrować kolumn hierarchicznych bez wartości null. Wstawia z subskrybenta kończy się niepowodzeniem, ponieważ nie ma wartości domyślnej dla kolumny hierarchyid w programie Publisher.

  • Filtrowanie wierszy jest obsługiwane tak długo, jak filtr nie zawiera kolumny hierarchyid .