Кто-нибудь использовал тип HierarchialID SQl Server 2008 для хранения генеалогических данных

StackOverflow https://stackoverflow.com/questions/577756

Вопрос

У меня есть генеалогическая база данных (на самом деле об овцах), которая используется заводчиками для исследования генетической информации.В каждой записи я сохраняю fatherid и motherid.В отдельной таблице я храню полную "сводную" информацию, чтобы я мог быстро составить полное генеалогическое древо любого животного, не просматривая всю базу данных...

Недавно обнаружил тип hierarchicalID, встроенный в SQL server 2008, на первый взгляд это звучит многообещающе, но мне и интересно, использовал ли кто-нибудь его достаточно, чтобы знать, будет ли это уместно в моем типе приложения (т. Е.двое родителей, несколько детей)?Все образцы, которые я нашел / прочитал до сих пор, касаются отношений типа менеджер / сотрудник, где у данного босса может быть несколько сотрудников, и у каждого сотрудника может быть один босс.

Потребности моего приложения схожи, но не совсем одинаковы.

Я уверен, что в любом случае углублюсь в эту новую технологию, но было бы неплохо сократить мои исследования, если бы кто-то уже знал, что она не была разработана таким образом, чтобы это позволило мне ее использовать.

Мне также любопытно, какую производительность люди видят, используя этот новый тип данных, по сравнению с другими методами, которые делают то же самое.

Это было полезно?

Решение

Я не вижу, как это могло бы сработать;в обычной иерархии существует единственная цепочка, ведущая к корню, поэтому она может хранить путь (который является двоичным является) к каждому узлу.Однако при наличии нескольких родителей это невозможно:даже если вы разделите матриархат и партиархат, у вас все равно останется 1 мать, 2 бабушки, 4 прабабушки и т.д. (даже не вдаваясь в некоторые из наиболее "интересных" возможных сценариев, особенно с домашним скотом).Не существует единого логического пути для кодирования, поэтому нет:Я не думаю, что это может сработать в вашем случае.

Тем не менее, я рад, что меня исправили.

Другие советы

Предполагая, что у каждой овцы есть один родитель мужского пола и одна родительница женского пола, и что ни одна овца не может быть ее собственным родителем (что приводит к временному парадоксу овец), тогда как насчет использования двух HIERARCHYID?

CREATE TABLE dbo.Sheep(
    MotherHID hierarchyid NOT NULL,
    FatherHID hierarchyid NOT NULL,
    Name int NOT NULL
)
GO
ALTER TABLE dbo.Sheep 
ADD CONSTRAINT PK_Sheep PRIMARY KEY CLUSTERED (
    MotherHID,
    FatherHID
)
GO

Сделав их совместным ПК, вы бы однозначно идентифицировали каждую овцу как продукт ее материнской иерархии и ее отцовской иерархии.

Здесь может скрываться какая-то внутренняя проблема, поэтому действуйте осторожно с парой простых прототипов - но изначально кажется, что у вас это сработает.

Использование двух отдельных HierarchyID для указания отца и матери будет работать хорошо.

Однако вы определенно НЕ хотели бы использовать их в качестве уникального индикатора строки, поскольку это ситуация "2 ко многим".(У двух овец может быть несколько детей.)

Я не вижу ничего изначально неправильного в использовании HierarchyId для ancestry - по крайней мере, для овец.Для людей отношения намного сложнее, чем "этот человек породил того человека", поэтому очевидно, что их использование будет ограничено размножением.

SQL Server hierarchyID не является надежным решением для многих вопросов генеалогического анализа.Он основан на ORDPATH, и я некоторое время использовал его в genealogy;но в генеалогии слишком много сценариев, которые не могут быть легко решены с помощью методов ORDPATH для ориентированных ациклических графов.Графическая база данных гораздо более надежна и хорошо подходит для генеалогии.Я использую Neo4j: http://stumpf.org/genealogy-blog/graph-databases-in-genealogy.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top