Отображение пользователей в древовидной структуре? - PullRequest
3 голосов
/ 09 июня 2011

У меня есть таблица базы данных с именем users

Эта таблица имеет два столбца (которые важны)

uuid и parentUuid

Вотправила для таблицы:

  • Если пользователь приглашает другого пользователя, столбец приглашенных пользователей parentUuid равен uuid приглашающего.
  • Если пользователь былне приглашен, их столбец parentUuid равен null
  • Пользователи могут быть бесконечными.

Я хочу создать функцию function counter($levels, $uuid){}

Когда вызывается счетчик (предположим, что $ levels = 3)

Я хочу, чтобы функция возвращала массив, который выглядит как

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

Так чтоОсновная идея заключается в том, что я хочу, чтобы для уровней $levels было отсчитано, сколько пользователей находится в дереве под пользователем.

Каков наилучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 09 июня 2011

Я бы расширил вашу таблицу пользователей, включив в нее столбец "level", который указывает глубину уровня от корня, которым является пользователь. Таким образом, когда новый пользователь добавляется, его уровень просто устанавливается на уровень родителя + 1.

Я знаю, что это решение несколько отличается от того, что вы запрашиваете, но процесс получения нужных вам данных из таблицы, которая не хранит пользовательские уровни, в лучшем случае сложен, а время выполнения потенциально очень долго. Это хороший пример ситуации, когда лучшим решением является небольшая модификация вашей схемы.

0 голосов
/ 10 июня 2011

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), чтобы убедиться, что ваша пирамида верна.

0 голосов
/ 09 июня 2011

То, что вы смотрите, это иерархические данные, хранящиеся в дереве с использованием модели списка смежности.Это очень сложно масштабировать.Попробуйте вместо этого преобразовать его во вложенный набор.В чем разница и как структурировать ваши данные, очень хорошо объяснено здесь: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

0 голосов
/ 09 июня 2011

Существует несколько способов хранения иерархических данных в базе данных. Я предлагаю использовать материализованный путь. В противном случае также работают вложенные наборы и списки смежности.

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

...