十分钟内学会:存储在二维表的树结构如何进行指定深度节点的查询
2006-12-12 00:36
399 查看
Question
在设计ASP.NET网站时,无限分级的商品分类或者论坛板块都可以使用树结构表示,存放到关系型数据库时大家也懂得用Id和ParentId两个字段来表示节点间的关系。然而这种最省存储空间的表示方法却不是最有效率的,在需要查询指定深度节点时就会遇到问题。我们需要通过递归来逐层展开才能获取到所有该层的节点,然后再在其中进行查询实在既浪费时间又浪费空间。那么有没有更好的做法呢?
Answer
通常在设计表示树结构的数据表时,我们会增加两个字段:Depth - 表示当前节点的深度的整数 Path - 表示从根节点到当前节点的路径的字符串,采用节点名称不可能出现的字符作为分隔符
在对树进行操作时,我们还是如平常一样对表执行CRUD操作,要维护这两个字段并不需要费多少力气,然而在查询时却会为我们带来极大的便利。例如要查询第3层的节点,则只需要使用"WHERE Depth = 3";又例如要查询A1节点下B3节点下C2节点下的所有子节点,则可以使用"WHERE Path LIKE 'A1/B3/C2%'"。
这样做的道理就在于,通过增加冗余信息来提高检索速度,同时这些冗余信息非常容易维护所以不容易因为操作不慎而导致信息不一致。设想一下你要对树增加/移动/删除一个节点,原本一条SQL语句就能完成的事情现在还是一条SQL语句就能完成,就算不依赖事务也绝对不会导致信息不一致。
明白了这个道理,我们就可以进行推广,例如我们既可能需要根据Id字段的路径来查询,又可能需要根据Name字段的路径来查询,那就分开IdPath和NamePath两个字段来表示两组路径字符串。
相关文章推荐
- 如何用 MySQL 进行存储过程编写,以用户登陆为例,结构清晰,涵盖内容很多
- sqlserver查询指定树形结构的所有子节点
- mysql读取树形结构所有子节点 mysql递归查询 详解 存储过程详解 查询所有子节点详解
- 如何在存储过程B中,对存储过程A的结果集进行查询
- 如何在存储过程B中,对存储过程A的结果集进行查询
- sqlserver查询指定树形结构的所有子节点
- 这两个类是java中进行key-value存储、查询的常用类,如果我们学习过哈希算法就会知道key-value查询的效率依赖于如何存储,换句话说,如果存的好,拿出来就容易,存的不好,拿出来就不方便。两
- SQL Server 树型结构查询指定节点 SQL Server 树型结构查询的排序
- 如何在存储过程B中,对存储过程A的结果集进行查询
- 用depth字段优化指定深度节点的查询
- 这两个类是java中进行key-value存储、查询的常用类,如果我们学习过哈希算法就会知道key-value查询的效率依赖于如何存储,换句话说,如果存的好,拿出来就容易,存的不好,拿出来就不方便。两
- VFP如何在文本框中输入文本时会弹出列表框并进行模糊查询
- Oracle 如何循环查询结果集,进行新增或修改
- 动态查询一个树形结构表中:某一个节点的所有父节点或者子节点
- 如何进行深度复制
- 如何在加载winform的时候自动改变treeview的指定根节点的字体颜色呢??
- 在S2SH整合中如何对其多表联合查询出来的数据,进行分页和排序
- 在查询时不能多个节点进行查询再建立关系
- 使用dtree生成的树结构,ajax动态加载子节点后,如何绑定右键菜单?求助
- [VB.NET]请教一个如何对姓名进行同音字查询?