树形数据结构的数据库结构

在数据库中实现一个可定制的(意思是具有未知数目的树结构)树数据结构的最好方法是什么?

在使用带有外键的表格之前,我已经完成了一次这个操作。

你可以看到什么其他的实现,这个实现是否有意义?

你提到了最常用的实现,即邻接列表: https : //blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

还有其他模型,包括物化path和嵌套集: http : //communities.bmc.com/communities/docs/DOC-9902

Joe Celko写了一本关于这个主题的书,这是一个从一般的SQLangular度来看的很好的参考(在上面的嵌套集合文章链接中提到过)。

另外,Itzik Ben-Gann对他的书“Inside Microsoft SQL Server 2005:T-SQL查询”中最常见的选项有很好的概述。

select模型时要考虑的主要因素是:

1)结构变化的频率 – 树的实际结构变化的频率。 一些模型提供更好的结构更新特性。 但是,将结构更改与其他数据更改分开很重要。 例如,您可能想要模拟公司的组织结构图。 有些人会将此模型作为邻接列表,使用员工ID将员工链接到其主pipe。 这通常是次优方法。 通常更好的方法是将组织结构与员工本身分开build模,并将员工作为结构的一个属性来维护。 这样,当员工离开公司时,组织结构本身就不需要改变,只需要和离职的员工build立联系。

2)树是重写的还是重读的 – 某些结构在读取结构时工作得很好,但在写入结构时会产生额外的开销。

3)您需要从结构中获得哪些types的信息 – 某些结构擅长提供关于结构的某些types的信息。 例子包括查找一个节点及其所有子节点,查找一个节点及其所有父节点,查找满足特定条件的子节点的数量等。您需要知道需要哪些信息从结构中确定最适合的结构你的需要。

看看在MySQL中pipe理分层数据 。 它讨论了在关系数据库中存储和pipe理分层(树状)数据的两种方法。

第一种方法是邻接表模型,这就是你基本描述的:有一个引用表本身的外键。 虽然这种方法很简单,但对于某些查询,如构build整个树,可能效率很低。

本文讨论的第二种方法是嵌套集合模型。 这种方法更加高效和灵活。 有关详细说明和示例查询,请参阅文章。

如果您必须使用Relational DataBase来组织树数据结构,那么PostgreSQL有一个很酷的ltree模块,它提供了用于表示存储在层次树状结构中的数据标签的数据types。 你可以从这里得到想法(更多信息请参见: http : //www.postgresql.org/docs/9.0/static/ltree.html )

通常使用LDAP来组织分层结构的logging。

拥有一个外键的表格对我来说是有意义的。

然后,您可以在SQL中使用公用表expression式或通过Oracle中的先前语句连接来构build树。

准备使用的function,可以用于邻接列表模型,使生活更简单的梦幻般的集合。

http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html

我在SQL SERVER 2005上使用了下面的实现