我有一个名为users
这个表有两列(很重要)
uuid
和parentUuid
以下是表格的规则:
parentUuid
列等于邀请者的uuid
。parentUuid
列为null
我想要做的是,创建一个函数function counter($levels, $uuid){}
调用计数器时(假设$ levels = 3)
我希望函数返回一个数组 看起来像
array(0 => 200, 1 => 600, 2 => 1800);
所以基本的想法是我希望它倒数,对于$levels
级别,用户下树中有多少用户。
这样做的最佳方式是什么?
答案 0 :(得分:3)
我将扩展您的用户表以包含“级别”列,该列指示用户所在根级别的深度。这样,当添加新用户时,他们的级别将被设置为父级+ 1。
我知道这与您要求的解决方案略有不同,但是从不存储用户级别的表中获取所需数据的遍历过程充其量是棘手的,并且执行时间也很长可能很长。这似乎是一个很好的例子,其中最好的解决方案是对您的架构稍作修改。
答案 1 :(得分:0)
有多种方法可以在数据库中存储分层数据。我建议使用物化路径。如果做不到这一点,嵌套集和邻接列表也可以工作。
答案 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),以确保您的金字塔正确。