Je ne pense pas qu'il y ait un besoin de récursion ici car la solution affichée par barry-brown semble adéquate. Si vous avez besoin d'un groupe pour pouvoir être membre d'un groupe, alors la méthode de traversée d'arbre proposée par Dems fonctionne bien. Les insertions, suppressions et mises à jour sont assez simples avec ce schéma, et la récupération de la hiérarchie entière est accomplie avec un seul select.
Je suggère d'inclure un champ parent_id dans votre table group_members (en supposant que c'est le point où votre relation récursive se produit). Dans un éditeur de navigation que j'ai créé une table de nœuds comme ceci:
tbl_nodes
----------
node_id
parent_id
left
right
level
...
Mon éditeur crée des objets hiérarchiquement liés à partir d'un noeud C# classe
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;
}
}
}
propriété des noeuds contient une liste de nœuds enfants. Lorsque la couche de gestion charge la hiérarchie, elle corrige les relations parent/enfant. Lorsque l'éditeur de navigation enregistre, je récursivement définir les valeurs de propriété gauche et droite, puis enregistrer dans la base de données. Cela me permet d'obtenir les données dans le bon ordre, ce qui signifie que je peux définir des références parent/enfant au cours de la récupération au lieu d'avoir à faire une seconde passe. Cela signifie également que tout ce qui doit afficher la hiérarchie (par exemple, un rapport) peut facilement extraire la liste de nœuds dans le bon ordre.
Sans un champ id_parent, vous pouvez récupérer une piste de navigation au noeud courant avec
select n1.*
from nodes n1, nodes n2
where d1.lft <= d2.lft and d1.rgt >= d2.rgt
and d2.id = @id
order by lft;
où @id est l'identifiant du nœud qui vous intéresse.
Assez évident, mais cela s'applique à des éléments tels que l'appartenance à un groupe imbriqué qui peut ne pas être évident, et comme d'autres l'ont dit, il n'est plus nécessaire de ralentir le SQL récursif.
Pourriez-vous s'il vous plaît définir une entité et comment elle se rapporte? – Brettski
Quel moteur de base de données utilisez-vous? –
Une entité est simplement une abstraction commune entre les utilisateurs et les groupes, puis un membre peut être un groupe ou un utilisateur. J'utilise PostgreSQL –