Я не думаю, что здесь существует необходимость в рекурсии, так как решение, размещенное барри-коричневым, кажется адекватным. Если вам нужна группа, чтобы быть членом группы, то метод обхода дерева, предлагаемый Dems, хорошо работает. Вставка, удаление и обновление довольно просты с этой схемой, а получение всей иерархии выполняется с помощью одного выбора.
Я бы предложил включить родительское поле в таблицу group_members (предполагая, что это точка, в которой происходит ваше рекурсивное отношение). В навигации редактора я создал таблицу узлов следующим образом:
tbl_nodes
----------
node_id
parent_id
left
right
level
...
Моего редактор создает иерархически связанные объекты из узлов класса C#
class node {
public int NodeID { get; set; }
public Node Parent { get; set; }
public int Left { get; set; }
public int Right { get; set; }
public Dictionary<int,Node> Nodes { get; set; }
public int Level {
get {
return (Parent!=null) ? Parent.Level+1 : 1;
}
}
}
Узлы свойство содержит список дочерних узлов. Когда бизнес-уровень загружает иерархию, он исправляет отношения родительский/дочерний. Когда сохраняет редактор nav, я рекурсивно устанавливаю значения свойств слева и справа, а затем сохраняю их в базе данных. Это позволяет мне получить данные в правильном порядке, что означает, что я могу установить родительские/дочерние ссылки во время извлечения, а не делать второй проход. Также означает, что все, что нужно для отображения иерархии (скажем, отчета), может легко получить список узлов в правильном порядке.
Без parent_id поля, вы можете получить строку навигацию к текущему узлу с
select n1.*
from nodes n1, nodes n2
where d1.lft <= d2.lft and d1.rgt >= d2.rgt
and d2.id = @id
order by lft;
где @id является идентификатором узла, вы заинтересованы в.
Довольно очевидный материал, действительно, но он применим к элементам, таким как членство вложенных групп, которые могут быть не очевидны, и, как говорили другие, устраняет необходимость замедления рекурсивного SQL.
Не могли бы вы определить сущность и как она относится? – Brettski
Какой двигатель базы данных вы используете? –
Сущность - это просто общая абстракция между пользователями и группами, тогда член может быть либо группой, либо пользователем. Я использую PostgreSQL –