在数据库中实现可自定义(即级别数未知的树结构)树数据结构的最佳方法是什么?
在使用带有外键的表之前,我已经做过一次。
您还可以看到其他哪些实现?这种实现是否有意义?
在数据库中实现可自定义(即级别数未知的树结构)树数据结构的最佳方法是什么?
在使用带有外键的表之前,我已经做过一次。
您还可以看到其他哪些实现?这种实现是否有意义?
Answers:
您提到最常用的实现方法,即邻接表:https : //blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets
还有其他模型,包括具体化的路径和嵌套集:http : //communities.bmc.com/communities/docs/DOC-9902
Joe Celko编写了关于此主题的书,从一般的SQL角度来看,这是一本很好的参考书(在上面的嵌套集文章链接中提到过)。
另外,Itzik Ben-Gann在他的书“ Inside Microsoft SQL Server 2005:T-SQL查询”中对最常见的选项进行了很好的概述。
选择模型时要考虑的主要事项是:
1)结构更改的频率-树木的实际结构更改的频率。一些模型提供更好的结构更新特性。但是,将结构更改与其他数据更改区分开来很重要。例如,您可能想为公司的组织结构图建模。某些人将其建模为邻接列表,使用员工ID将员工链接到其主管。这通常是次优的方法。一种通常更有效的方法是将组织结构与员工本身分开建模,并将员工保持为该结构的属性。这样,当员工离开公司时,无需更改组织结构本身,只需更改与离开的员工的联系即可。
2)树是重写入还是重读取-某些结构在读取结构时效果很好,但在写入结构时会产生额外的开销。
3)您需要从结构中获取哪些类型的信息-一些结构擅长提供有关该结构的某些类型的信息。例如,找到一个节点及其所有子节点,找到一个节点及其所有父节点,找到满足特定条件的子节点数,等等。您需要知道从结构中需要什么信息来确定最适合的结构您的需求。
如果您必须使用Relational DataBase来组织树数据结构,则Postgresql具有很酷的ltree模块,该模块提供用于表示存储在分层树状结构中的数据标签的数据类型。您可以从那里得到这个想法。(有关更多信息,请参见:http : //www.postgresql.org/docs/9.0/static/ltree.html)
通常,LDAP用于组织层次结构的记录。
拥有一张带有外键的桌子对我来说确实很有意义。
然后,您可以在SQL中使用公用表表达式,或者在Oracle中使用connect by before语句来构建树。
丰富的现成可用功能,可以与邻接表模型一起使用,以简化生活。
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
如果有人使用MS SQL Server 2008和更高版本着迷于此问题:SQL Server 2008和更高版本具有专门为此任务设计的新“ hierarchyId”功能。
有关更多信息,请访问https://docs.microsoft.com/zh-cn/sql/relational-databases/hierarchical-data-sql-server