无限层次扩展 和 查询性能 矛盾的解决

经典问题,刚好以前解决过,分享一下: 就是逻辑树,怎么存储的问题。

主要考虑点: 无限层次扩展 和 查询性能 矛盾的解决。

基本模式:
表:Location

 

编码名称父编码
CN中国 
ZJ浙江省CN
HZ杭州市HZ
XH滨江区HZ
NB宁波市ZJ


优点: 模型简约而不简单, 支持任意层次扩展。
缺点:查询一个节点的所有子节点需要递归,效率不高。
一般解决: Oracle 中有这个语句可以解决查询问题 select * from XXX start with id=76 connect by prior parentid=id。 但是数据量大时效率有影响。
更好的解决:用好Cache。 一般这类数据都比较固定,而且量不会非常大,使用Cache,无论是程序递归查询,还是 connect by prior 语句,问题都不大。

索引表支持
如果属性结构数据量比较大或变动频繁, 应用比较关注性能,可以增加一个索引表来解决

行政区划索引表 ( Location_Index ) ( 主键:ID, PID)

编码上线编码(非父级(PID))相差存次(offset)
CN  
ZJCN1
HZCN2
HZZJ1
XHCN3
XHZJ2
XHHZ1


 这张索引表以扁平化结构存储任意层次两个节点间的关系。检索效率很高:
1.查询任意节点的子节点: select * from Location_Index where PID = ‘ZJ’;
2.查询任意节点的所有父节点: select * from Location_Index where ID = ‘XH’;
3.判断任意两个节点是否在同一分支上: select * from Location_Index where ID = ‘XH’ and PID = ‘CN’;

当然,高性能是以空间和处理复杂度为代价的。

a) 新增一个节点时:除了要在 Location 表中增加一条记录, 同时要在 Location_Index 表增加 若干条记录。
b) 删除一个节点是,除了要在 Location 表中增加一条记录, 同时要在 Location_Index 表删除 若干条记录。

当然,这个逻辑并不复杂。而且 Location_Index 所增加的空间也是值的的。原来的 0001.0001这样的索引可以不需要,也能节省很多空间。


总结:
1) 表结构:基本表和索引表, Location,Location_Index。
2) 特点:支持无限层次节点的树结构;
查询效率很高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值