2013-05-09 111 views
3

我得开发一个用户链,如图所示。在零级它有一个成员,一级二级,二级将有四级,三级有八级成员......就像明智的第九级将有512名成员,这是最后阶段。二叉树映射数据库查询

在编程视图中,为了将成员的位置与他的右边&左翼相关联到x的等级,运行2^x查询是可悲的。 (对于第9级,2^9查询将命中分贝)

是否有任何其他方式减少命中数到db?我们如何更好地映射成员之间的关系?

enter image description here

回答

1

构造一个树表和区表。树表将包含父,子,侧作为列。区域表格包含用户ID,区域(本例中应显示所有区域,本例中为9)和长度(最顶层父节点的长度)作为列。所以在区表中第一级节点将有一个入口,第二个节点将得到两个入口,同样第九个将有九个入口。

现在当一个节点必须被显示时,为了检索其下面的所有节点,现在编写一个像select * from zone where userid=xx这样的查询,将这个结果映射到树表,以确定哪个节点位于哪个节点下和哪个边。

0

从数据库获取的父子关系的形式,所有的数据,然后将结果存储在二叉树设置

Parent  Child 
===================== 
NULL  17265 
17265  17270 
17265  17394 
17270  17796 
17270  17797 
... 
... 
... 
... 

现在用这个就变得容易积二进制文件树(INFACT任何树)
所以你的函数原型添加节点将是这个样子

public void add(int parent, int child); 

注意:
该方法原型是Java语言。

+0

正确,但有没有办法知道右翼和左翼成员没有去分贝?如果不是,要将树显示到第9级,则必须运行512个查询。有没有其他的方法。 – 2013-05-09 10:59:15

0

在关系数据库中,我将创建一个单一的表像

create table node(
    nodeid bigint not null primary key, 
    nodeparent bigint references node (nodeid), 
    nodegroup bigint, 
    nodename varchar(80), // add attributes as needed 
); 

做这样一个查询“SELECT * FROM节点,在节点组= 17 ORDER BY NODEID”,取得一个结果集的所有节点。扫描集合并在内存中创建树。

哈乔

+0

这里再考虑一下,在任何阶段,任何位置都可能是空白的,如果在中间创建了一个新节点,那么在它下面会生成一棵树,该树必须再次插入到桌子中间。我们如何解决这个问题? – krishna 2013-05-09 12:09:00