2011-11-13 149 views
2

我正在寻找最佳的方式来存储和查询家族树(人与他们的关系像家谱一样的人)到关系数据库。图和关系数据库

我想,这可以很容易地通过使用图形数据库,但我有一个强大的约束。

我使用.NET和微软的技术,理想可能是找到某种技术,可以在一个关系数据库之上坐这样既可以在同一时间使用..

任何建议或建议,欢迎!

谢谢你们 Riana

+0

当你说关系数据库时,你的意思是MS SQL服务器吗?你想要执行什么类型的查询? – svick

+0

我正在使用MS SQL Server,但问题由所有关系数据库共享。我希望能够检查简单的信息,例如,如果两个人是彼此的祖父,或者如果他是他的表弟等...... –

+0

什么是阻止你在SQL中这样做? – svick

回答

1

如果你有一个表

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

您可以查询关系与简单连接。

这是如何让所有的兄弟姐妹一个人与[email protected]

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 

为了让表弟,你需要两个层次的加入等

要获得整个谱系图事情变得更复杂一点点,但您可以使用recursive CTE来生成给定父母的所有后代。

4

由于任何给定的人只能有一个母亲和一个父亲(不一定都是已知的),所以您不需要有向图的广义表示。这样一个简单的“二元”图应该是足够了:

enter image description here

查询兄弟姐妹,祖先,后裔等..应该是在这种模式相当简单。

+1

“任何特定的人只能有一个母亲和一个父亲” - 虽然在生物学上是真实的,但它没有考虑收养和/或离婚/再婚(例如继父)。 – Duncan

2

我认为有一个针对.Net的Graph数据库。 它被称为BrightStarDB Sparql和LinQ作为查询手段。

+2

欢迎来到StackOverflow!你是否认为* BrightStarDB是一个针对.Net的图形数据库,或者你知道*是肯定的?答案应该是:答案,从不猜测。请注意,我最初几次出现,我猜对了自己......当然我猜错了......并且被我的同伴们无情地低估了。另外,当提到这样的产品时,最好包含一个链接。 –

1

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中独立使用任何db。例如,您可以使用gramps加载所有数据以“创建”您的数据库,然后独立使用它来进行查询。