我开发了一个用户链,如图所示。在零级,它有一个成员,一级二,二级有4,级别3有8个成员。比如明智的第9级将有512个成员,这是最后阶段。
在程序化视图中,将成员的位置与他的权利和权利相互关联。左翼到x
级别,运行2^x
查询是可悲的。 (对于第9级,2 ^ 9个查询将命中db)
还有其他方法可以减少db的命中率吗?我们怎样才能更好地映射成员之间的关系?
答案 0 :(得分:1)
Storing Hierarchical Data in a Database的优秀教程。
此外,HERE是一个类似的问题,有一些可靠的解决方案。
答案 1 :(得分:1)
构造树表和区域表。树表将包含父,子,边作为列。区域表包含用户ID,区域(在其中应显示所有区域,在本例中为9)和长度(从最顶层父节点开始的长度)作为列。因此在区域表中,第1级节点将有一个条目,第2行节点将获得两个条目,同样第9级将有9个条目。
现在,当必须显示一个节点时,要检索其下面的所有节点,写一个像select * from zone where userid=xx
这样的查询现在用树表映射这个结果,以决定哪个节点位于哪个节点和哪一侧。
答案 2 :(得分:0)
以父子关系的形式从数据库中获取所有数据,然后将结果集存储在二叉树中
Parent Child
=====================
NULL 17265
17265 17270
17265 17394
17270 17796
17270 17797
...
...
...
...
现在使用它可以很容易地绘制二叉树(实际上是任何树) 所以添加节点的函数原型看起来就像这样
public void add(int parent, int child);
注意:强>
方法原型是Java语言。
答案 3 :(得分: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 node WHERE nodegroup = 17 ORDER BY nodeid”的查询以获取一个结果集中的所有节点。扫描整个集并在内存中创建树。
哈乔