设为首页 收藏本站
查看: 1016|回复: 0

[经验分享] 在Oracle中实现可扩展的多级编目结构

[复制链接]
YunVN网友  发表于 2016-8-15 07:19:08 |阅读模式


 
  2009-10-16 作者:zhangyuk 来源:章鱼的blog

 
  一、可扩展多级编目的定义
  可扩展多级编目有下述特点:
  编目分级,上下级编目形成父子关系;
  任意节点可以有零到多个子节点,任意子节点有且只有一个父节点;
  节点深度在理论上可以无限扩充;
  由上述特点可知,可扩展多级编目实际上是树。
  二、可扩展多级编目的例子
  Windows操作系统中的文件路径是一个典型的多级编目结构。多级编目结构的例子还有很多:人的家谱、文献索引、制造业的BOM、财务的科目编码、公司组织结构等。
  三、可扩展多级编目在Oracle中的设计
  概念设计:
DSC0000.jpg
  物理设计:
DSC0001.jpg
DSC0002.jpg
  多级编目表的设计思路跟“树”的设计思路一样。ID是行的唯一标识,用Oracle的序列和触发器(可参见有关文章)实现自增长。PARENTID是指向本表的外键,如果该行有父节点则引用本表中父节点行的ID,如果该行是根节点则为空。
  四、用connect by遍历多级编目表
  用Oracle提供的connect by命令可以正序或逆序遍历多级编目表。正序遍历的例子:

  select ID,PARENTID,NAME,DESCRIBE,levelfromXXX_CLASS_TAB
  connectby PARENTID =prior ID
  startwith PARENTID isnull
  connect by的标准语法为:
  SELECT expression [,expression] …
  FROM [user.] table
  WHERE condition
  CONNECT BY [PRIOR] expression = [ PRIOR ] expression
  START WITH expression = expression
  ORDER BY expression
  Start with指定从哪个节点开始遍历;
  Connect by 指定父子节点的连接方式,其中prior修饰遍历的初始节点;
  Order by 指定排序关键字,但是使用order by 会破坏节点的遍历顺序;
  Connect by 工具允许Level关键字,Level代表节点的深度;
  用where可以过滤行,但不影响其关系节点;
  用connect by可以过滤行以及该行的关系节点。
  五、提高connect by的查询效率
  如果多级编目表的数据较多或层次较多,为了提高查询效率,可以为多级编目表建立索引。索引的建立取决于connect by子句。上面例子的connect by子句为:

  connectby PARENTID =prior ID
  这时可以为该表建立两个索引,第一个索引在 PARENTID和ID上建立,第二个索引在ID和PARENTID上建立。这样无论正序还是逆序遍历该表,都会用索引访问代替全表扫描,从而提高查询效率。
  六、排序会打乱多级编目表的遍历顺序
  connect by按照深度优先原则进行遍历,所以尽管使用各种排序的办法,connect by仍然会将搜索深度最大的行排在前面。也就是说,在connect by 中使用order by 将得不到正确的遍历顺序。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257915-1-1.html 上篇帖子: oracle性能调整的十大要点-SQL优化 下篇帖子: Oracle 存储过程JAVA调用存储过程 游标使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表