SQL - How to store and navigate hierarchies?您用来对数据库中的层次结构信息进行建模和检索的方式是什么? 我喜欢修改的预排序树遍历算法。此技术使查询树变得非常容易。 但是,这里是有关该主题的链接列表,这些链接是我从Zend Framework(PHP)贡献者网页上复制的(由Laurent Melmoux在2007年6月5日15:52发布)。 许多链接与语言无关: 有两种主要的表示形式和算法来表示数据库的层次结构:
在这里有很好的解释:
这是我收集的更多链接:
邻接表模型
嵌套集
Graphes
课程: 嵌套集数据库树Adodb
访问模型ADOdb
PEAR :: DB_NestedSet
梨树
nstrees
关于这一主题的确定性文章是由Joe Celko撰写的,他已经将其中的许多著作写成一本书,名为《 SQL for Smarties中的Joe Celko的树和层次结构》。 他赞成一种称为有向图的技术。在此可以找到他在该主题上的工作简介。 在SQL数据库中表示层次结构的最佳方法是什么?一种通用的便携式技术? 假设层级结构大部分是被读取的,但不是完全静态的。假设这是一棵家谱。 不这样做的方法如下:
并像这样插入数据:
而是将节点和关系拆分为两个表。
数据创建如下:
现在,您可以运行不涉及将表自身重新连接起来的任意查询,如果与节点在同一行中具有异常关系,则会发生这种情况。 谁有祖父母?
您所有的后代:
谁是叔叔?
您避免了通过子查询将表连接到自身的所有问题,常见的限制是16个子查询。 麻烦的是,维护祖先表有点困难-最好通过存储过程来完成。 我必须不同意乔希。如果您使用的是公司组织这样的大型分层结构,会发生什么。人们可以加入/离开公司,更改报告线,等等。维护"距离"将是一个大问题,您将必须维护两个数据表。 该查询(SQL Server 2005及更高版本)将使您看到任何人的完整行,并计算他们在层次结构中的位置,并且只需要一个用户信息表。可以对其进行修改以查找任何子关系。
仅供参考:SQL Server 2008针对这种情况引入了新的HierarchyID数据类型。使您可以控制行在水平和垂直方向上在"树"中的位置。 Oracle:选择...以...开始...以...连接 Oracle对SELECT进行了扩展,可以轻松进行基于树的检索。也许SQL Server具有类似的扩展名? 该查询将遍历嵌套关系存储在父列和子列中的表。
http://www.adp-gmbh.ch/ora/sql/connect_by.html 我更喜欢Josh和Mark Harrison所用的技术: 两张表,其中一张包含Person的数据,另一张带有层次结构信息(person_id,parent_id [,mother_id])(如果此表的PK为person_id),则您有一棵简单的树,其中每个节点只有一个父级(在在这种情况下,但在其他情况下(例如会计帐户)则没有) 可以通过递归过程或如果您的数据库通过诸如SELECT ... BY PRIOR(Oracle)之类的语句支持该层次结构表。 其他可能性是,如果您知道要维护的层次结构数据的最大深度是使用单个表,并且每个层次结构级别具有一组列 当为[fleXive]实现树组件并使用MySQL文档中tharkun提到的嵌套集树模型方法时,我们遇到了相同的问题。 除了(以戏剧性的方式)加快速度之外,我们还使用了一种分散的方法,这意味着我们对顶层右边界使用了最大的Long值,这使我们可以插入和移动节点,而无需重新计算所有的left和right值。左和右的值是通过将节点的范围除以3并使用内部的三分之一作为新节点的边界来计算的。 可以在这里看到一个Java代码示例。 如果您使用的是SQL Server 2005,则此链接说明如何检索分层数据。 只要您习惯使用通用表表达式(CTE),它们就可以成为您的朋友。 |