Граф и реляционная база данных

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

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

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

Любые предложения или советы приветствуются!

Спасибо, ребята, Риана


person Riana    schedule 13.11.2011    source источник
comment
Когда вы говорите о реляционной базе данных, вы имеете в виду сервер MS SQL? Какие запросы вы хотите выполнять?   -  person svick    schedule 13.11.2011
comment
Я использую MS SQL Server, но проблема характерна для всех реляционных БД. Я хотел бы иметь возможность проверять простую информацию, например, является ли два человека дедушкой друг друга или его двоюродным братом и т. д. ...   -  person Riana    schedule 13.11.2011
comment
А что вам мешает сделать это в SQL?   -  person svick    schedule 13.11.2011
comment
Конечно, этого можно добиться с помощью SQL, но я ищу лучший или самый простой способ, если хотите. Спасибо   -  person Riana    schedule 14.11.2011


Ответы (4)


Поскольку у любого данного человека может быть только одна мать и один отец (не обязательно оба известные), вам не нужно обобщенное представление ориентированного графа. Простого «бинарного» графика вроде этого должно быть достаточно:

введите здесь описание изображения

Запрос братьев и сестер, предков, потомков и т. д. в этой модели должен быть довольно простым.

person Branko Dimitrijevic    schedule 13.11.2011
comment
любой данный человек может иметь только одну мать и одного отца - хотя биологически это верно, это не объясняет усыновления и/или разводов/повторных браков (например, отчимов). - person Duncan; 28.09.2012

Я думаю, что есть база данных Graph, ориентированная на .Net. Он называется BrightStarDB Sparql и LinQ в качестве средства для запросов.

person BionicCyborg    schedule 06.07.2012
comment
Добро пожаловать в StackOverflow! Как вы считаете, что BrightStarDB — это графовая база данных, предназначенная для .Net, или вы знаете наверняка? Ответы должны быть такими: отвечает, никогда не догадывается. Имейте в виду, что в первые несколько раз я угадал сам... и, конечно же, угадал неправильно... и мои коллеги-участники безжалостно заминусовали меня. Кроме того, когда речь идет о подобном продукте, хорошей идеей будет включить ссылку на него. - person Bob Kaufman; 06.07.2012

Если у вас есть стол

FamilyTree
----------
ID       int not null PK,
ParentID int,
Name     nvarchar(50)

Вы можете запрашивать отношения с помощью простых соединений.

Вот как передать всех братьев и сестер человеку с ID=@SearchPersonID

select sibling.* from FamilyTree parent
inner join FamilyTree child
on parent.ID = child.ParentID
inner join FamilyTree sibling
on parent.ID = sibling.ParentID
where child.ID <> sibling.ID
where child.ID = @SearchPersonID

Чтобы получить двоюродных братьев, вам нужны два уровня соединений и т. Д.

Чтобы получить целое генеалогическое древо, все становится немного сложнее, но вы можете использовать рекурсивный CTE для создания всех потомков от данного родителя.

person Albin Sunnanbo    schedule 13.11.2011

gramps (http://gramps-project.org/) — платформа генеалогии с открытым исходным кодом (http://www.gramps-project.org/wiki/index.php?title=Portal:Developers). Он написан на питоне и имеет загрузки для работы в Windows. В зависимости от ваших мотивов (например, почему вам нужно, чтобы это была реляционная база данных), она может работать для вас из коробки, или вы можете использовать ее только для изучения ее исходного кода. Он имеет уровень абстракции данных, поэтому может работать с несколькими базовыми базами данных (http://www.gramps-project.org/wiki/index.php?title=Using_database_API). Таким образом, вы можете получить доступ к любой базе данных, которую вы используете, независимо от gramps. Например, вы можете использовать gramps для загрузки всех ваших данных, чтобы «создать» свою базу данных, а затем использовать ее независимо для своих запросов.

person Duncan    schedule 28.09.2012