Поделиться через


Справочник по методам типа данных hierarchyid

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureБаза данных SQL в Microsoft Fabric

Тип данных hierarchyid является системным типом данных переменной длины. Тип данных hierarchyid используется для представления положения в иерархии. Столбец иерархии типов не представляет дерево автоматически. Приложение должно создавать и назначать значения иерархии таким образом, чтобы требуемое отношение между строками отражается в значениях.

Значение типа данных hierarchyid представляет позицию в древовидной иерархии. Значения hierarchyid обладают следующими свойствами.

  • Чрезвычайно компактный: среднее количество битов, необходимых для представления узла в дереве с n узлами, зависит от среднего количества дочерних элементов узла. Для небольших вентиляторов (0-7), размер составляет около 6 * logA n bits, где A является средним вентилятором. Узел в организационной иерархии 100 000 человек со средним вентилятором шести уровней занимает около 38 бит. Эта величина округляется до 40 бит (5 байт), которые необходимы для хранения.

  • Сравнение находится в порядке глубины: учитывая два значения a и bозначаетa<b, что до b в глубине первого обхода дерева. Индексы для типов данных hierarchyid располагаются в порядке приоритета глубины, а узлы, встречающиеся рядом при проходе по дереву с приоритетным направлением глубины, хранятся рядом друг с другом. Например, потомки некоторой записи хранятся рядом с этой записью. Дополнительные сведения см. в разделе "Иерархические данные" (SQL Server).

  • Поддержка произвольных вставок и удалений: с помощью метода GetDescendant всегда можно создать одноуровневый элемент справа от любого заданного узла, слева от любого заданного узла или между двумя братьями и сестрами. Свойство сравнения сохраняется, если произвольное число узлов вставляется в иерархию или удаляется из нее. Большинство операций вставки и удаления сохраняют свойство компактности. Однако вставки между двумя узлами создают значения иерархии с немного менее компактным представлением.

  • Кодировка ограничена 892 байтами: Таким образом, узлы, имеющие слишком много уровней в их представлении, чтобы соответствовать 892 байтам, не могут быть представлены типом hierarchyid .

Тип hierarchyid доступен клиентам среды CLR в качестве SqlHierarchyId типа данных.

Remarks

Тип данных hierarchyid логически кодирует сведения об одном узле в дереве иерархии, кодируя путь от корня дерева к этому узлу. Такой путь логически представлен в виде последовательности меток всех посещенных дочерних узлов, начиная с корня. Представление начинается косой чертой, а путь к корню представлен одной косой чертой. Для уровней ниже корня каждая метка кодируется в виде последовательности целых чисел, разделенных точками.

Сравнения дочерних узлов выполняется путем сравнения этих целочисленных последовательностей, разделенных точками, в лексикографическом порядке. Уровни разделяются косой чертой. То есть косая черта отделяет родительский узел от дочернего. Например, следующие пути с длиной 1, 2, 2, 3 и 3 уровня соответственно допустимы для типа hierarchyid:

  • /
  • /1/
  • /0.3.-7/
  • /1/3/
  • /0.1/0.2/

Узлы можно вставлять в любое место. Узлы, вставляемые после /1/2/ , но до /1/3/ этого можно представить как /1/2.5/. Узлы, вставляемые до 0 того, как иметь логическое представление в виде отрицательного числа. Например, узел, который поставляется раньше /1/1/ , можно представить как /1/-1/. Узлы не могут иметь начальные нули. Например, /1/1.1/ является допустимым, но /1/1.01/ недопустимым. Чтобы избежать ошибок, вставляйте узлы с помощью метода GetDescendant.

Преобразование типов данных

Тип данных hierarchyid можно преобразовывать в другие типы описанным ниже образом.

  • Используйте метод ToString для преобразования значения иерархии в логическое представление в виде типа данных nvarchar(4000 ).

  • Используйте чтение (ядро СУБД) с помощью CSharp и write для преобразования иерархии вvarbinary.

  • Чтобы передать параметры иерархии через SOAP, сначала приведение их в виде строк.

Обновление баз данных

При обновлении базы данных до более новой версии SQL Server новая сборка и тип данных hierarchyid устанавливаются автоматически. Помощник по обновлению обнаружит все пользовательские типы данных или сборки с конфликтующими именами. Помощник по обновлению рекомендует переименовать любую конфликтующую сборку и переименовать любой конфликтующий тип или использовать в коде двух частей имена, чтобы ссылаться на этот ранее существующий тип пользователя.

Если обновление базы данных обнаруживает сборку пользователя с конфликтующим именем, она автоматически переименовывает сборку и помещает базу данных в подозрительный режим.

Если во время обновления обнаруживается пользовательский тип данных с конфликтующим именем, никаких специальных шагов не предпринимается. После обновления существует как старый тип пользователя, так и новый системный тип. Тип пользователя доступен только с помощью двух частей.

Использование столбцов hierarchyid в реплицированных таблицах

Столбцы с типом данных hierarchyid могут использоваться во всех реплицированных таблицах. Требования к приложению зависят от того, является ли репликация одной направления или двунаправленной, а также от используемых версий SQL Server.

Однонаправленная репликация

Однонаправленная репликация включает репликацию моментальных снимков, репликацию транзакций и репликацию слиянием, в которой изменения не вносятся на подписчике. Как столбцы hierarchyid работают с одной направленной репликацией, зависит от версии SQL Server, запущенной подписчиком.

  • Издатель SQL Server может реплицировать столбцы иерархии на подписчик SQL Server той же версии без каких-либо особых соображений.

  • Издатель SQL Server должен преобразовать столбцы иерархии , чтобы реплицировать их на подписчик под управлением SQL Server Compact или более раннюю версию SQL Server. SQL Server Compact и более ранние версии SQL Server не поддерживают столбцы иерархии . Если вы используете одну из этих версий, вы по-прежнему можете реплицировать данные на подписчик. Для этого следует установить параметр схемы или уровень совместимости репликации (для репликации слиянием), чтобы столбец можно было преобразовать в совместимый тип данных.

Фильтрация столбцов поддерживается в обоих случаях. При этом производится фильтрация столбцов типа hierarchyid. Фильтрация строк поддерживается, если фильтр не включает столбец hierarchyid .

Двунаправленная репликация

Двунаправленная репликация включает репликацию транзакций с обновляемыми подписками, одноранговую репликацию транзакций и репликацию слиянием, при которых изменения выполняются на подписчике. Репликация позволяет настраивать таблицу со столбцами типа данных hierarchyid для двунаправленной репликации. Обратите внимание на следующие требования и рекомендации.

  • Издатель и все подписчики должны работать с одной и той же версией в SQL Server 2016 (13.x) или более поздней версии.

  • Репликация реплицирует данные в виде байтов и не выполняет никаких проверок для обеспечения целостности иерархии.

  • Иерархия изменений, внесенных в источник (подписчик или издатель), не поддерживается при репликации в место назначения.

  • Значения столбцов hierarchyid могут иметь одинаковые двоичные представления во всех базах данных. Конфликты могут возникать в двунаправленной репликации, когда логика приложения независимо создает один и тот же иерархий для разных сущностей . Поэтому на подписчике и издателе могут создаваться одинаковые значения, но применяются они к разным строкам. Репликация не проверяет наличие этого условия, и нет встроенного способа секционирования значений столбцов иерархии , так как для столбцов нет IDENTITY . Чтобы избежать подобных необнаруживаемых конфликтов, приложения должны использовать ограничения или другие механизмы проверки.

  • Возможно, что строки, вставляемые на подписчик, могут быть потеряны. Родительская строка вставленной строки может быть удалена на издателе. Это приводит к необнаруживаемому конфликту, если строка из подписчика вставляется на издателе.

  • Фильтры столбцов не могут отфильтровать столбцы иерархии , не допускающие значения NULL. Вставка из подписчика завершается ошибкой, так как значение по умолчанию для столбца hierarchyid на издателе отсутствует.

  • Фильтрация строк поддерживается, если фильтр не включает столбец hierarchyid .