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

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 28 февраля 2009

Предполагая, что у каждой овцы есть один родительский мужчина и один родительский женский, и что никакая овца не может быть ее собственным родителем (приводя к временному парадоксу овцы), тогда как насчет использования двух 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

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

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

3 голосов
/ 23 февраля 2009

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

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

2 голосов
/ 03 августа 2011

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

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

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

0 голосов
/ 20 февраля 2018

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

...