二叉树映射数据库查询

时间:2013-05-09 10:52:21

标签: php mysqli binary-tree binary-search-tree

我开发了一个用户链,如图所示。在零级,它有一个成员,一级二,二级有4,级别3有8个成员。比如明智的第9级将有512个成员,这是最后阶段。

在程序化视图中,将成员的位置与他的权利和权利相互关联。左翼到x级别,运行2^x查询是可悲的。 (对于第9级,2 ^ 9个查询将命中db)

还有其他方法可以减少db的命中率吗?我们怎样才能更好地映射成员之间的关系?

enter image description here

4 个答案:

答案 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”的查询以获取一个结果集中的所有节点。扫描整个集并在内存中创建树。

哈乔