Я хотел бы создать пользовательский тип CLR в SQL Server 2005, который обладает теми же преимуществами производительности, что и иерархия для иерархий моделей.
У кого-нибудь есть идеи / указатели?
Я нашел его - как реализован иерархический идентификатор. Это хитрый алгоритм, который называется ORDPATH.
http://www.cs.umb.edu/~poneil/ordpath.pdf
(через: http://sqlkpi.com/BLOGS/BOBB/post/ORDPATH-ORDPATH-everywhere.aspx)
Это может быть интересный сайд-проект.
SQL Server кодирует hierarchyid, используя кодировку, основанную на ORDPATH, но отличающуюся от него.
hierarchyid
Можно найти «физическое представление» hierarchyid в [MS-SSCLRT]: форматы сериализации типов CLR Microsoft SQL Server . Подведем итог:
Кодируйте каждое число n в hierarchyid как битовую строку, используя кодирование переменной длины. Если . следует n в hierarchyid, закодируйте n+1 вместо n.
n
.
n+1
Длина строки битов не должна быть кратна восьми!
Детали кодировки слишком длинные, чтобы включать их здесь. Обратите внимание, что кодировка должна поддерживать отрицательные целые, нулевые и положительные целые числа. Это также должно сохранять порядок. То есть для целых чисел a и b с кодировками e(a) и e(b), если a > b, то e(a) > e(b) (при сравнении лексикографических кодировок).
a
b
e(a)
e(b)
a > b
e(a) > e(b)
Добавить 1 к битовой строке, если / следует за номером. Добавьте 0 к битовой строке, если за номером следует ..
/
Объединить все битовые строки.
Добавляйте 0 к результату шага 3, пока длина не будет кратна 8. (Если она уже была кратна 8, вы не добавите здесь 0).