该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-14
id parent_id 001 null 002 001 003 001 004 003 005 003 那么要查询001的所有子节点应该为002,003,004,005 查询003的所有子节点则为004,005。 hibernate中用native sql查询方式可以用oracle的connect by的途径实现, 但是这个只能适用于oracle db,sql server则不行了, 那么除了用递归还有没有其他更好的办法? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-14
循环sql句。。。性能不是很差必竟都是有索引的。。
|
|
返回顶楼 | |
发表时间:2007-05-15
不少人投为新手贴,有点困惑,是更好的方案都处都有,还是。。。。?
老手们是不屑一谈,还是根本就不知道有其他办法? 其实这个问题很多人都存在,不过我从没在一个地方看到有其他解决方案, 真的就没有更好的办法了?我不信,毕竟既要跨数据库又想提高性能 的开发人员还是存在,递归这样的办法只是没办法的办法,一个公司组织结构 存在五六层,几百个部门,甚至更多,如果递归的话性能只能说很一般。 PS: 新手贴还是老手贴,这种东西的评价放在论坛中不见的是有意思的事。 真要想管理好帖子内容,不如就做一些智能点东西, 比如根据一些规则,自动把对应文章转移到对应的位置。 同时还可以通知用户转移的位置/原因。 如果一个论坛不能成为一个平台,而只是成为少数人的交流地,那么这个论坛要发展我想很难, 除非论坛定为就是这样,那算我白说. |
|
返回顶楼 | |
发表时间:2007-05-15
我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid 001 0 0 002 001 001002 003 001 001003 004 003 001003004 005 003 001003005 在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。 |
|
返回顶楼 | |
发表时间:2007-05-15
财务系统的科目结构就是一个比较典型的例子。
|
|
返回顶楼 | |
发表时间:2007-05-15
循环不爽的话,可以用这种方式
(建一视图。。。)视图比表多一个字段。这个字段是递归方式生成父ID的集合用逗号分开。。。。。 laoer 写道 我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid 001 0 0 002 001 001002 003 001 001003 004 003 001003004 005 003 001003005 在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。 刚刚发现有人说过了。。。 PS:才6票怕什么,民主就是这样的。。。到了25也可以申诉么。。。 |
|
返回顶楼 | |
发表时间:2007-05-19
laoer 写道 我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid 001 0 0 002 001 001002 003 001 001003 004 003 001003004 005 003 001003005 在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。 旧版本系统我是这样做的,但是后果有点严重, 比如公司部门结构改动,002变成003下面的一个部门,那么这个之后的所有部门 都必须要重新更新treeid,这个变动的部门排在越前面影响越大。 小公司还好,但是我们公司上千个部门,改动就影响比较大了。 所以结构我觉得还是下面三个组合在一起比较好: id parent_id index 有上面三个数据就可以很好的建立树的结构,而且相互之间影响最小。 |
|
返回顶楼 | |
发表时间:2007-05-19
抛出异常的爱 写道 循环不爽的话,可以用这种方式
(建一视图。。。)视图比表多一个字段。这个字段是递归方式生成父ID的集合用逗号分开。。。。。 laoer 写道 我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid 001 0 0 002 001 001002 003 001 001003 004 003 001003004 005 003 001003005 在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。 刚刚发现有人说过了。。。 PS:才6票怕什么,民主就是这样的。。。到了25也可以申诉么。。。 民主是好事,不过就怕挂着民主的口号把一些可以讨论的问题埋藏了。 建个view来处理这个treeid,倒是可以解决更新的问题,看看有没有办法处理这个view |
|
返回顶楼 | |
发表时间:2007-05-19
支持treeid的做法
|
|
返回顶楼 | |
发表时间:2007-05-20
04年作过这样的设计,
oracle有SQL支持, db2有SQL支持, postgresql没支持,自己写几个存储过程在sql里面当作函数调用,同样可以。 sql server也可以这样搞吧。 |
|
返回顶楼 | |