日期:2014-05-16  浏览次数:20466 次

我的编程经验之 树型结构数据的数据库设计
一般树型结构的关系表设计有两种算法,路径码和间值法
pathcode插入、删除、查询较为方便,更新数据较为麻烦,不过一般的pathcode设计查询排序会出点小问题。
看例子
x.11
x.6
逻辑上0.6应该排前面,
改进
x.06
x.11
限制了子节点数量,操作积累会压缩子节点上限,不自由
再改
x.6
x.7
x.8
x.9
x.90
x.91
x.92
...
x.98
x.99
x.990
x.991
如果有一万个子节点,比如论坛高楼
则有1000+的路径长度
再改(两个一组)
x.00
x.01
x.02
x.03
...
x.99
x.9900
x.9901
x.9902
...
x.9999
x.999900
也可以n个一组
写一个工具类处理复杂的逻辑,比如subPoint的计算和next brother pathcode获得
欢迎讨论!

我说得不够清晰
假设以上n等于1

那么如果我要查询x.3的所有子分类的关联实体(比如可以假设商品和商品分类树)
那么我查询 where pathcode>=x.3 and pathcode < x.4 order by pathcode (非jpql也非sql,能看懂就可)
可能结果
x.3
x.3.0
x.3.1
x.3.1.8
x.3.1.9
x.3.1.90
x.3.2
x.3.4
x.3.5
x.3.9
x.3.90
x.3.993
这个顺序本身就是顺序良好的树,好处就是支持树分页

如果查x.9
where pathcode>=x.9 and pathcode < x.90 order by pathcode
可能结果
x.9
x.9.0
x.9.1
...

比一般pathcode多出的好处就是查询结果本身就是一个顺序良好的树

2 楼 afadgaeg 2009-10-08  
http://www.iteye.com/topic/15829
当要实现继承查询,又不想(也不适合)使用实体继承,比如树状回帖的时候,就有用了。
这个虽然复杂了点,不过包装好后用起来很方便,高度灵活。当然必须根据需求选择
3 楼 Ihavegotyou 2009-10-09  
用oracle实现的。你可以改为其他的数据库。 算法也附加上了。
http://ihavegotyou.iteye.com/admin/blogs/483600
4 楼 bdceo 2009-10-09  
树形结构的设计最好是事先知道树形结构的深度
即路径码的实现方式,这样路径的宽度就可以很好的控制
可是,程序的可扩展性就不那么好了...
间值法就不太了解了,还有一种常用的实现一个表通过id关联
这个id既可以是父节点也可以是子节点
这样子在Hibernate里好像用的还可以吧...
5 楼 whaosoft 2009-10-09  
bdceo 写道
树形结构的设计最好是事先知道树形结构的深度
即路径码的实现方式,这样路径的宽度就可以很好的控制
可是,程序的可扩展性就不那么好了...
间值法就不太了解了,还有一种常用的实现一个表通过id关联
这个id既可以是父节点也可以是子节点
这样子在Hibernate里好像用的还可以吧...


Hibernate的 自身关联1 to many 可以的
6 楼 afadgaeg 2009-10-09  
Ihavegotyou 写道
用oracle实现的。你可以改为其他的数据库。 算法也附加上了。
http://ihavegotyou.iteye.com/admin/blogs/483600

我的目的主要是要实现继承查询而不使用orm继承,比如需要支持查询 "地板"、"门窗"分类,也能查询"建材"得到所有属于"建材"子分类的商品。而且不再需要再次绘制树,比如新浪论坛树结构,需要分页的情况下,不可能把数据都读出来在分页,而只读取部分数据无法构建树,以上算法支持查询时直接由数据库构建树,不需要应用层干预。
7 楼 Ihavegotyou 2009-10-09  
afadgaeg 写道
Ihavegotyou 写道
用oracle实现的。你可以改为其他的数据库。 算法也附加上了。
http://ihavegotyou.iteye.com/admin/blogs/483600

我的目的主要是要实现继承查询而不使用orm继承,比如需要支持查询 "地板"、"门窗"分类,也能查询"建材"得到所有属于"建材"子分类的商品。而且不再需要再次绘制树,比如新浪论坛树结构,需要分页的情况下,不可能把数据都读出来在分页,而只读取部分数据无法构建树,以上算法支持查询时直接由数据库构建树,不需要应用层干预。



不太明白你说的,你是说根据查询条件生成一棵子树? 如果你能附图就好了。
8 楼 afadgaeg 2009-10-09  
Ihavegotyou 写道
afadgaeg 写道
Ihavegotyou 写道
用oracle实现的。你可以改为其他的数据库。 算法也附加上了。
http://ihavegotyou.iteye.com/admin/blogs/483600

我的目的主要是要实现继承查询而不使用orm继承,比如需要支持查询 "地板"、"门窗"分类,也能查询"建材"得到所有属于"建材"子分类的商品。而且不再需要再次绘制树,比如新浪论坛树结构,需要分页的情况下,不可能把数据都读出来在分页,而只读取部