树形结构表的存储【转自:https://www.cnblogs.com/Tjna/p/9026980.html】

一、树形结构例子分析:

以360问答页面为例:http://wenda.so.com/c/

我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为:

①根节点

②根节点的第一层子节点

③为左侧所选择节点的下一层子节点

(图1)

该例简化的树形结构图如下:

(图2)

我们不难发现,每当点击图1红框内的类别时,页面主体问题部分会显示该类别节点下所有子节点的问题。因此,需要实现查询出某节点所有子节点的功能。

二、表的存储:

需要存储两张表:

1、类别表

create table [QType]
(
QID int not null primary key,
QPID int not null,
QPath varchar(max) not null,
QTypeContent varchar(max) not null
)

·路径字段的添加方法:找到父节点的Path +“,”+自身的ID 即可。

2、问题表

create table QContent
(
ContentID int not null primary key,
TypeID int not null,
Content varchar(max) not null
)

·问题表的TypeID即为类别表的QID

三、表的查询

//查询出某ID的所有子节点(包含自身)
select * from QType where CHARINDEX((select QPath from QType where QID=参数),QPath)>0

CHARINDEX函数说明:CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

通过CHARINDEX如果能够找到对应的字符串,则返回该字符串位置,否则返回0。因此当其>0时表示能在路径中找到相应字符串,即可查询到自身以及子节点。

例如:

//查找出以2为ID节点的所有子节点(包含自身)
select * from QType where CHARINDEX((select QPath from QType where QID=2),QPath)>0

查询结果:

因此,实现以上功能(即点击类别找到相应问题显示),则为:

select QContent.Content from QContent where QContent.TypeID IN
(select QType.QID from QType where CHARINDEX((select QType.QPath from QType where QID=参数),QPath)>0)

四、总结

通过新增一个路径字段的方法,可以无需使用递归,有效提高效率。

正在学习中,欢迎大家指出问题&相互交流!

原文地址:https://www.cnblogs.com/skj0330insn/p/9029389.html

时间: 2024-11-05 20:38:33

树形结构表的存储【转自:https://www.cnblogs.com/Tjna/p/9026980.html】的相关文章

「SQL归纳」树形结构表的存储与查询功能的实现——通过路径方法(非递归)

一.树形结构例子分析: 以360问答页面为例:http://wenda.so.com/c/ 我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为: ①根节点 ②根节点的第一层子节点 ③为左侧所选择节点的下一层子节点 (图1) 该例简化的树形结构图如下: (图2) 我们不难发现,每当点击图1红框内的类别时,页面主体问题部分会显示该类别节点下所有子节点的问题.因此,需要实现查询出某节点所有子节点的功能. 二.表的存储: 需要存储两张表: 1.类别表 create table [

Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结

Atitit.各种  数据类型 ( 树形结构,表形数据  ) 的结构与存储数据库 attilax  总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 java c# php ( Dic/Map      List    datatable ) 1 3. 数据库存储数据  1 4. 数据的表形显示( 多条记录 与单条记录 ) 2 5. ASP.NET 数据控件:GridView,DataList,Repeater ,DetailsView,FormVie

树形结构表查询,只用一条SQL语句查询所有父级ID解决办法

在树形结构表查询中用得最多的就是查询指定分类的所有下级分类,这个性能比较好的解决方案是为分类加一个编码(路径)把父级的ID都拼接上,最后通过like 'x%'就能把所有下级分类select出来.但是有时也会遇到反过来,找出指定分类的所有上级分类,这个情况尤其在分销或类传销的系统中最常见,因为他们分成都是上级分成,所以要找出指定人的上级集合. 下面分享一下我的解决方案(只用一条SQL语句.不用存储过程.函数): 有下面所在的新闻分类表. ParentID为父级的ID. 下面要找出ID为52的所有上

SQL批量更新具有树形结构表Path字段

如上图所示,需要更新该表中Path字段,如ID=14的Path值:-1,ID=17的Path值:-1.14,ID=20的Path值:-1.14.18.19 步骤1.创建函数 Create FUNCTION [dbo].[F_Org] ( @id int ) RETURNS TABLE AS RETURN ( with testTable as( select UpperID from Core_DeptInfo where ID=@id union all select Core_DeptInf

sqlserver 树形结构表查询 获取拼接结果

树形表结构如下 IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[Test]') AND type IN ('U')) DROP TABLE [dbo].[Test] GO CREATE TABLE [dbo].[Test] ( [Id] bigint IDENTITY(1,1) NOT NULL, [TypeName] nvarchar(50) COLLATE Chinese_PRC_CI

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是mssql和postgre,这个不需多讲,我们只讲讲单表情况下的postgre如何通过迭代查询获取有层级关系的数据. 一.表结构举例 MENU表 ID VARCHAR2(32)     N   sys_guid()    节点idFENXID VARCHAR2(32)

树形结构的数据库表Schema设计-基于左右值编码

树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Schema及其对 应的CRUD算法是实现关系型数据库中存储树形结构的关键. 理想中树形结构应该具备如下特征:数据存储冗余度小.直观性强:检索遍历过程简单高效:节点增删改查CRUD操作高效.无意

[从产品角度学EXCEL 02]-EXCEL里的树形结构

这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布于特定网站.不接受任何无授权转载,如需转载,请先联系我,非常感谢. 2 EXCEL里的树形结构 这段时间,上海街边的树上陆陆续续长出了嫩芽,放眼望去有各种层次的绿色,格外好看.我们今天的话题,恰好也与树有关.只不过,树都是往天空伸展枝叶的,而我们这里讨论的‘树’,却是由根部出发,逐行逐行往下延展.伸展. 还记

树形结构的数据库的存储

程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化.理想中树形结构应该具备如下特征:数据存储冗余度小.直观性强:检索遍历过程简单高效:节点增删改查CRUD操作高效. 列举了一个食品族谱的例子进行讲解,通过类别.颜色和品种组织食品,树形结构图如下: 1,对树形结构最直观的分析莫过于节点之间的继承关系上,通过显示地描述某一节点的父节点,从而能够建立二维的关系表,则这种方案的Tree表结构通常设计为:{