我要开发一个如图所示的用户链。在零级它有一个成员,第一级有两个,第二级将有 4 个,第三级有 8 个成员。同样,第 9 级将有 512 个成员,这是最后阶段。
在程序化视图中,将成员的位置与他的左右翼关联到一个级别x
,运行2^x
查询是可悲的。(对于第 9 级,2 ^ 9 个查询将命中 db)
有没有其他方法可以减少对 db 的点击次数?我们如何更好地映射成员之间的关系?
我要开发一个如图所示的用户链。在零级它有一个成员,第一级有两个,第二级将有 4 个,第三级有 8 个成员。同样,第 9 级将有 512 个成员,这是最后阶段。
在程序化视图中,将成员的位置与他的左右翼关联到一个级别x
,运行2^x
查询是可悲的。(对于第 9 级,2 ^ 9 个查询将命中 db)
有没有其他方法可以减少对 db 的点击次数?我们如何更好地映射成员之间的关系?
在数据库中存储分层数据的优秀文章。
此外,这里是一个类似的问题,有一些可靠的解决方案。
构造树表和区域表。树表将包含父、子、侧作为列。区域表包含用户 ID、区域(应显示的所有区域,在本例中为 9)和长度(从最顶部的父节点开始的长度)作为列。所以在区域表中,第 1 级节点将有一个条目,第 2 行节点将有两个条目,同样第 9 级节点将有 9 个条目。
现在,当必须显示一个节点时,要检索其所有下面的节点,请编写一个查询,如select * from zone where userid=xx
now 将此结果映射到树表,以确定哪个节点位于哪个节点下方和哪一侧。
以父子关系的形式从您的数据库中获取所有数据,然后将结果集存储在二叉树中
Parent Child
=====================
NULL 17265
17265 17270
17265 17394
17270 17796
17270 17797
...
...
...
...
现在使用它可以很容易地绘制你的二叉树(实际上是任何树)
所以你添加节点的函数原型看起来像这样
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 node WHERE nodegroup = 17 ORDER BY nodeid”之类的查询以获取一个结果集中的所有节点。扫描集合并在内存中创建树。
哈乔