3

我要开发一个如图所示的用户链。在零级它有一个成员,第一级有两个,第二级将有 4 个,第三级有 8 个成员。同样,第 9 级将有 512 个成员,这是最后阶段。

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

有没有其他方法可以减少对 db 的点击次数?我们如何更好地映射成员之间的关系?

在此处输入图像描述

4

4 回答 4

1

在数据库中存储分层数据的优秀文章。

此外,这里是一个类似的问题,有一些可靠的解决方案。

于 2013-05-09T12:26:10.033 回答
1

构造树表和区域表。树表将包含父、子、侧作为列。区域表包含用户 ID、区域(应显示的所有区域,在本例中为 9)和长度(从最顶部的父节点开始的长度)作为列。所以在区域表中,第 1 级节点将有一个条目,第 2 行节点将有两个条目,同样第 9 级节点将有 9 个条目。

现在,当必须显示一个节点时,要检索其所有下面的节点,请编写一个查询,如select * from zone where userid=xxnow 将此结果映射到树表,以确定哪个节点位于哪个节点下方和哪一侧。

于 2013-05-12T06:07:05.470 回答
0

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

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

现在使用它可以很容易地绘制你的二叉树(实际上是任何树)
所以你添加节点的函数原型看起来像这样

public void add(int parent, int child);

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

于 2013-05-09T10:58:22.837 回答
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”之类的查询以获取一个结果集中的所有节点。扫描集合并在内存中创建树。

哈乔

于 2013-05-09T10:59:10.780 回答