浏览 3991 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-08
最后修改:2010-01-14
内容来自: http://www.postgresql.org/docs/8.4/static/release-8-4.html [Easier to usr than ever] 我猜想很多开发者在遇到比如组织结构,菜单管理等具有树状属性的数据管理的时候,会犹豫不决,表如何设计呢,在很久以前,曾经有如下设计组织表t_org_m【当时使用mssqlserver2000或者postgresql7.3】: id 比如: 11 p_id 比如: 10 name 比如: 销售部 order_by_no 比如: 1000.1001 . . . 数据表中可能是这样的 id pid name order_by_no 10 0 XX公司 1000 11 10 销售部 1000.1000 12 10 财务部 1000.1001 13 11 销售组 1000.1000.1000 14 11 销售组2 1000.1000.1001 我们插入如上的数据来形成树状数据,查询的时候直接 select * from t_org_m order by order_by_no 可是在编辑的时候,或者调整数据排序的时候,是很麻烦的,需要变更很多的数据,如果把一级节点修改到上一级或者下一级,那么修改内容是很多很多的,为了速度,还使用存储过程来辅助解决节点排序的问题。 有没有更简洁的办法,当然有: 如果使用oracle9i,或者db2我想问题不至于这么复杂,基本一样的表结构设计,但数据内容稍有不同 id 比如: 11 p_id 比如: 10 name 比如: 销售部 order_by_no 比如: 1 id pid name order_by_no 10 0 XX公司 1 11 10 销售部 1 12 10 财务部 2 13 11 销售组 1 14 11 销售组2 1 在存储的时候,order—by_no的数据不一样了,和上面的差别在哪儿呢: 前者记录的用"."分隔的数据其实是这条数据在全局树中的排序,但是后者用的是简单的数字,代表的是在兄弟节点中的顺序。 其实order_by_no类型也不同 前者 type varchar200 后者 type integer 查询的时候如何查询呢: select * from t_org_m start with id=10 connect by prior id=p_id order by order_by_no; 这种办法可以更简便的得到树状查询结果,而且是更便于编辑。 因为工作的缘故,我接触了很多版本的postgresql,而且正在使用8.3的版本,关心postgresql的朋友可能知道enterprsedb,这个是postgresql商业化的结果,enterprsedb建立在postgresql基础之上,目标兼容oracle数据类型和过程语言格式,最终可以达到替换oracle的结果,在enterprsedb中已经拥有了类似oracle的递归查询功能,可是postgresql8.3却不存在,虽然外国一家公司,看域名可能是奥地利的 http://www.postgresql.at/english/produkte_postgresql_e.html开发了一款Postgresql8.3RC版,拥有递归查询的功能,但是我却希望伯克利研究postgresql的高人们能开发出同等功能。 终于等到了8.4,他声称的的递归查询到底怎么样的,拭目以待。 最后请大家多多关注postgresql,个人觉得他是开源数据库领域的超重量级产品。就他的历史,他在全球范围内的影响力而言,与他在中国的受关注度和影响力好像不太协调。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-09
这种组织结构现在不都是用左右值来做吗?
|
|
返回顶楼 | |
发表时间:2009-07-09
我在oracle里用过递归查询,虽然方便,可是性能确不算好。
比楼上提到的左右值(标准提法是Nested Set,嵌套集合)的数据结构要慢很多倍。 |
|
返回顶楼 | |
发表时间:2009-07-09
Nested Set,嵌套集合方式确实有独到之处,查询确实更快,不过在新增节点和更新节点的时候,需要变更很多数据,这一点也是需要考虑的。
如果查询操作远大于更新插入操作,这种处理方式应该适用。 |
|
返回顶楼 | |
发表时间:2010-01-28
如果采用树状结构的更新数据情况小于查询那么采用 Nested 结构用前序遍历速度远远高于邻接表结构。
|
|
返回顶楼 | |