当前位置:首页 > 科技数码

树形结构 树形结构数据存储方案(一):邻接列表模式

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

上一篇

跛脚 吴锡豪子女现状揭秘,吴锡豪为什么跛脚?

下一篇

现在的 吕乐妻子白月嫦照片,吕乐的五亿相当于现在多少

盖洛普路径 员工幸福感已经是企业管理的主题

盖洛普路径 员工幸福感已经是企业管理的主题

盛田昭夫在他的《日本制造》一书中写道:归根结底,你的企业及其未来掌握在你雇佣的人手中。更极端的是,你的企业命运其实掌握在最年轻的员工手中。“我们都知道员工的经历会影响一个组织的发展,但如何影响呢?   01-员工福利会影响组织绩效吗? 休伯特·拉姆珀萨德(Hubert Rampersad)在他的著...

新一佳超市有限公司 新一佳超市的组织结构图,新一佳为什么倒闭?

  • 新一佳超市有限公司 新一佳超市的组织结构图,新一佳为什么倒闭?
  • 新一佳超市有限公司 新一佳超市的组织结构图,新一佳为什么倒闭?
  • 新一佳超市有限公司 新一佳超市的组织结构图,新一佳为什么倒闭?

超市组织结构 新一佳超市的组织结构图,新一佳为什么倒闭?

  • 超市组织结构 新一佳超市的组织结构图,新一佳为什么倒闭?
  • 超市组织结构 新一佳超市的组织结构图,新一佳为什么倒闭?
  • 超市组织结构 新一佳超市的组织结构图,新一佳为什么倒闭?

新一佳 新一佳超市的组织结构图,新一佳为什么倒闭?

  • 新一佳 新一佳超市的组织结构图,新一佳为什么倒闭?
  • 新一佳 新一佳超市的组织结构图,新一佳为什么倒闭?
  • 新一佳 新一佳超市的组织结构图,新一佳为什么倒闭?

博鳌国际旅游论坛 博鳌国际旅游论坛:探寻“文化+旅游”的中国路径

  • 博鳌国际旅游论坛 博鳌国际旅游论坛:探寻“文化+旅游”的中国路径
  • 博鳌国际旅游论坛 博鳌国际旅游论坛:探寻“文化+旅游”的中国路径
  • 博鳌国际旅游论坛 博鳌国际旅游论坛:探寻“文化+旅游”的中国路径

休闲夹克男装 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)

  • 休闲夹克男装 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)
  • 休闲夹克男装 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)
  • 休闲夹克男装 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)

休闲男装夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)

  • 休闲男装夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)
  • 休闲男装夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)
  • 休闲男装夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)

男装休闲夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)

  • 男装休闲夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)
  • 男装休闲夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)
  • 男装休闲夹克 休闲风格的结构制图:大衣、衬衫、夹克(男装篇)