以树形结构显示用户?

时间:2011-06-08 22:14:33

标签: php mysql nested-sets

我有一个名为users

的数据库表

这个表有两列(很重要)

uuidparentUuid

以下是表格的规则:

  • 如果用户邀请其他用户,则受邀用户parentUuid列等于邀请者的uuid
  • 如果未邀请用户,则其parentUuid列为null
  • 可以有无限级别的用户。

我想要做的是,创建一个函数function counter($levels, $uuid){}

调用计数器时(假设$ levels = 3)

我希望函数返回一个数组 看起来像

array(0 => 200, 1 => 600, 2 => 1800);

所以基本的想法是我希望它倒数,对于$levels级别,用户下树中有多少用户。

这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:3)

我将扩展您的用户表以包含“级别”列,该列指示用户所在根级别的深度。这样,当添加新用户时,他们的级别将被设置为父级+ 1。

我知道这与您要求的解决方案略有不同,但是从不存储用户级别的表中获取所需数据的遍历过程充其量是棘手的,并且执行时间也很长可能很长。这似乎是一个很好的例子,其中最好的解决方案是对您的架构稍作修改。

答案 1 :(得分:0)

有多种方法可以在数据库中存储分层数据。我建议使用物化路径。如果做不到这一点,嵌套集和邻接列表也可以工作。

https://communities.bmc.com/communities/docs/DOC-9902

答案 2 :(得分:0)

您正在查看的是使用邻接列表模型存储在树中的分层数据。这很难扩展。尝试将其转换为嵌套集。这里有很好的区别以及如何构建数据:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

答案 3 :(得分:0)

SAP几乎在任何地方都使用层次结构,这是表的结构:

首先,您需要确保您的条目列表具有唯一标识符UnID,即使您需要的信息不是UnID。 UnID可以是数字,以便于增量。

然后,当您将项目添加到层次结构表时,您应该以这种格式存储它们:

NodeID  
    Note: 0 is always the root nodeID. Any other entry is the UnId of the new entry. It can never be null

ParentID 
    Note: this is the UnID of the parent that you want to attribute to the new entry. It can never be null

ChildId 
    Note: this can be null. It is updated only when this New entry gets to be a parent. 

NextId 
    Note: this is the important one. It determines which child is next in the sequence of children below the parent. The last one in the sequence is always null

Level
    Note: this ensures that a UnID cannot be the parent at more than one level.

你需要一些程序逻辑来消除在这里某处注释中提到的创建循环引用的尝试,但暗示这意味着当引用发生时你必须更新层次结构表中的三条记录:新条目,父母和父母的最后一个孩子(带有nextID),以确保您的金字塔正确。