我得开发一个用户链,如图所示。在零级它有一个成员,一级二级,二级将有四级,三级有八级成员......就像明智的第九级将有512名成员,这是最后阶段。二叉树映射数据库查询
在编程视图中,为了将成员的位置与他的右边&左翼相关联到x
的等级,运行2^x
查询是可悲的。 (对于第9级,2^9查询将命中分贝)
是否有任何其他方式减少命中数到db?我们如何更好地映射成员之间的关系?
我得开发一个用户链,如图所示。在零级它有一个成员,一级二级,二级将有四级,三级有八级成员......就像明智的第九级将有512名成员,这是最后阶段。二叉树映射数据库查询
在编程视图中,为了将成员的位置与他的右边&左翼相关联到x
的等级,运行2^x
查询是可悲的。 (对于第9级,2^9查询将命中分贝)
是否有任何其他方式减少命中数到db?我们如何更好地映射成员之间的关系?
构造一个树表和区表。树表将包含父,子,侧作为列。区域表格包含用户ID,区域(本例中应显示所有区域,本例中为9)和长度(最顶层父节点的长度)作为列。所以在区表中第一级节点将有一个入口,第二个节点将得到两个入口,同样第九个将有九个入口。
现在当一个节点必须被显示时,为了检索其下面的所有节点,现在编写一个像select * from zone where userid=xx
这样的查询,将这个结果映射到树表,以确定哪个节点位于哪个节点下和哪个边。
从数据库获取的父子关系的形式,所有的数据,然后将结果存储在二叉树设置
Parent Child
=====================
NULL 17265
17265 17270
17265 17394
17270 17796
17270 17797
...
...
...
...
现在用这个就变得容易积二进制文件树(INFACT任何树)
所以你的函数原型添加节点将是这个样子
public void add(int parent, int child);
注意:
该方法原型是Java语言。
在关系数据库中,我将创建一个单一的表像
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”,取得一个结果集的所有节点。扫描集合并在内存中创建树。
哈乔
这里再考虑一下,在任何阶段,任何位置都可能是空白的,如果在中间创建了一个新节点,那么在它下面会生成一棵树,该树必须再次插入到桌子中间。我们如何解决这个问题? – krishna 2013-05-09 12:09:00
为Storing Hierarchical Data in a Database一个优秀titorial。
另外,HERE是一个类似的问题,有几个固体解决方案。
非常方便的参考链接。 – 2013-05-09 12:39:30
正确,但有没有办法知道右翼和左翼成员没有去分贝?如果不是,要将树显示到第9级,则必须运行512个查询。有没有其他的方法。 – 2013-05-09 10:59:15