免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5352 | 回复: 14
打印 上一主题 下一主题

从数据库构造树的问题,困扰了几天 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-12 21:44 |只看该作者 |倒序浏览
python初学者
我想构造一棵树
数据库结构为:
id   name   parent_id
1      a                       
2      aa           1
3      aaa         2
4      bb           1

想构造成如下结构:

<li>a
     <ul>
          <li>aa
                 <ul><li>aaa</li></ul>
           </li>
           <li>bb
            </li>
</li>

这应该是比较常见的功能吧
我用递归每一个循环都要查询一次数据,是不是效率太低了(虽然没实现但也差不多了)。

论坛徽章:
0
2 [报告]
发表于 2010-07-12 21:45 |只看该作者
数据不只是3级,无线分级的

论坛徽章:
0
3 [报告]
发表于 2010-07-13 00:24 |只看该作者
节点数量级是千?万? 一次性读取后在内存用list构造个tree总可以吧。

论坛徽章:
0
4 [报告]
发表于 2010-07-13 08:29 |只看该作者
回复 2# zhaoyh603

什么数据库?大多数数据库sql也支持递归。

论坛徽章:
0
5 [报告]
发表于 2010-07-13 13:50 |只看该作者
啥样的树。 有什么特点。 一次要取出的数有多大。 总数居量多少。

论坛徽章:
0
6 [报告]
发表于 2010-07-13 21:15 |只看该作者
有八级应该够了 数据量记录数在1k以内,数据库mysql

论坛徽章:
0
7 [报告]
发表于 2010-07-13 21:28 |只看该作者
每个节点查一次数据也不是还可以.
如果效率不能满足要求 可以一次读出来. 不才不到1K么.
还有办法就是修改表结构 用nested set代替现有结构。

论坛徽章:
0
8 [报告]
发表于 2010-07-14 02:36 |只看该作者
"""
在Oracle下面的一个connect by 语句,形成一个树的数据结构
select level,connect_by_isleaf,t_dept.companyid,t_dept.companyname,t_dept.parentcompanyid from t_dept start with parentcompanyid is null connect by prior companyid = parentcompanyid

取出数据: data = oracle_cur.fetchall()

"""
# 生成一个Json格式的树结构
def tree(tree_set):
    """recieve record struct: [level,isleaf,thisid,thisname,parentid]"""
    rem_node = {}
    tree = []
    for level,isleaf,thisid,thisname,parentid in tree_set:
        if isleaf == 0 :
            node = {"id":thisid,"text":unicode(thisname,'gbk'),'children':[]}
        else :
            node = {"id":thisid,"text":unicode(thisname,'gbk'),'leaf':True}
        
        rem_node.update({str(thisid):node})
        
        if level == 1:
            tree.append(node)
        else :
            rem_node[str(parentid)]['children'].append(node)
        print isleaf,thisid,thisname,parentid
        #return tree
    return cjson.encode(tree)   

if __name__ == '__main__':
    tt = tree(data) #可以找一个支持json数据格式的javascript树控件,记得当时是用Jquery做的。
    print tt

论坛徽章:
0
9 [报告]
发表于 2010-07-14 06:51 |只看该作者
通过XML技术实现吧。

论坛徽章:
0
10 [报告]
发表于 2010-07-14 08:14 |只看该作者
回复 6# zhaoyh603
mysql支持递归查询。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP