Граф и реляционная база данных - PullRequest
2 голосов
/ 13 ноября 2011

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 13 ноября 2011

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

enter image description here

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

2 голосов
/ 06 июля 2012

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

1 голос
/ 28 сентября 2012

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

1 голос
/ 13 ноября 2011

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

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 для генерации всех потомков от данного родителя.

...