www.biaodianfu.com/adjacency-list.html
在程序开发过程中,我们经常使用树形结构来表示一些数据之间的关系,比如企业的组织结构、商品的分类、操作栏目等。目前关系数据库都是以二维表的形式记录和存储数据,如果需要将树形结构的数据存储在二维表中,就必须进行Schema设计。最近对这方面比较感兴趣,特意梳理了一下。以下是常见树形结构的数据:
最简单的方法是邻接表。简单来说,就是根据节点之间的继承关系,把某个节点的父节点描述的活灵活现,从而建立一个二位关系表。表结构通常设计为{Node_id,Parent_id},如下图所示:
使用连接表的近似代码:
& lt?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
// $parent是我们希望看到的子代的父代
//$当我们深入到树的深处时,
//用于显示漂亮的缩进树
function display _ children($ parent,$level)
{
//获取父节点$parent的所有子节点
$ result = MySQL _ query(' SELECT name FROM tree WHERE parent = ')。$parent。";' );
//显示每个子节点
while($ row = MySQL _ fetch _ array($ result))
{
//缩进显示节点名称
echostr_repeat(',$level)。$row['name']。“n”;
//再次调用此函数,显示子节点的子节点
display_children($row['name'],$ level+1);
}
}
?>。
在整个结构的根节点(Food)上使用该功能可以打印出整个多级树形结构。由于Food是根节点,其父节点为空,所以调用如下:display _ children(",0)。显示整个树的内容。如果只想显示整个结构的一部分,比如水果部分,可以这样称呼:display _ children('水果',0);
几乎使用同样的方法,我们可以知道从根节点到任何节点的路径。比如Cherry的路径是“食物>:;水果。;红色.为了得到这样的路径,我们需要从最深层的“Cherry”开始,查询它的父节点“Red”并将其添加到路径中,然后我们查询Red的父节点并将其添加到路径中,以此类推,直到最高层的“Food”
以下是代码:
& lt?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
// $node是最深的节点
functionget_path($node)
{
//查询该节点的父节点
$ result = MySQL _ query(' SELECT parent FROM tree '。
WHERE name=“”。$node。";' );
$ row = MySQL _ fetch _ array($ result);
//用数组保存路径
$ path = array();
//如果不是根节点,继续向上查询
//(根节点没有父节点)
if($row['parent']!='')
{
//到$node的路径的最后一部分是名称
//的父节点
$ path[]= $ row[' parent '];
//我们应该添加这个节点的父节点的路径
//到路径
$ path = array _ merge(get _ path($ row[' parent ']),$ path);
}
//返回路径
return $ path
}
?>。
如果对“Cherry”:print _ r(get _ path(' Cherry '))使用此函数,将得到这样一个数组:
数组
(
[0]= >;食品
[1]= >;水果
[2]= >;红色
)
这种方案的优点是显而易见的:结构简单易懂,因为它们之间的关系只由一个parent_id维护,添加、删除、更改都非常容易,只需要更改与他直接相关的记录。当然缺点也很突出:因为节点之间的继承关系是直接记录的,所以对Tree的任何CRUD操作都会效率低下,这主要归因于频繁的“递归”操作,递归过程不断访问数据库,每次数据库IO都会有时间开销。比如你想返回所有的果实,也就是果实的所有后代,这好像是一个简单的操作,需要一堆递归。当然,这个方案也不是一无是处。树里层次少的时候很实用。在邻接表模式的基础上,可以扩展平表。不同的是节点的级别和当前节点的顺序也放在表中,更适合评论这类场景。具体的表格结构类似于此,这里就不深入阐述了。
参考链接:
http://Salman-w . blogspot . com/2012/08/PHP-邻接表-层次-树-遍历. html
https://packagist.org/search/?标签=邻接% 20列表
1.《树形结构 树形结构数据存储方案(一):邻接列表模式》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《树形结构 树形结构数据存储方案(一):邻接列表模式》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1639081.html