2009-09-28 7 views
2

I ont une table qui contient des enregistrements qui sont liés de la manière suivante:données dans une table emboîtées de base de données

parent

, enfant, petit-enfant.

Je voudrais être en mesure d'exécuter des requêtes pour effectuer les opérations suivantes:

  1. récupérer tous les enregistrements descendent d'un enregistrement particulier
  2. récupérer tous les dossiers qui sont directs enfants d'un enregistrement particulier (par exemple seulement les enfants directs)
  3. récupérer tous les dossiers qui sont petits-enfants d'un enregistrement particulier (ie seulement petits-enfants)
  4. récupérer le grand-parent d'un dossier
  5. récupérer le parent d'un enregistrement
  6. récupérer tous les dossiers (et leurs enfants et petits-enfants)

Je veux que cette requête renvoie les données d'une manière triée, donc je peux créer un document structuré (par exemple XML à partir du résultat de la requête). Par « tri », je veux dire que le jeu de résultats est « Groupés » par un parent THEN enfant, petit-enfant ALORS

J'ai conçu une table simple, comme celui-ci (CODE PSEUDO):

CREATE TABLE family_tree {id integer 
        , parent_id integer 
        , child_id integer 
        , fname varchar(16) 
        , lname varchar(32) }; 

J'ai un certain nombre des questions:

  1. (compte tenu des questions que je veux courir [(1) - (6) ci-dessus]) est c'est le meilleur (à savoir la structure de la table la plus efficace que je peux utiliser ?. Si non, qu'est-ce que c'est?

  2. Quelqu'un peut-il m'aider à écrire des instructions SQL ANSI pour effectuer des requêtes (1) - (6) ci-dessus?

+0

id, parentid devrait être sufficiant. Utilisez-vous sql server 2005+? –

+1

recherche SO pour des termes comme « ensemble imbriqué » et « données hiérarchiques » et vous trouverez beaucoup de choses. – markus

+0

Qu'est-ce que la base de données utilisez-vous ? Oracle a des requêtes hiérarchiques (CONNECT BY) – Thilo

Répondre

2

Vérifiez le sitepoint tutorial à ce sujet.

  • La méthode récursive de stockage des données (id, parent_id) vous permet de récupérer les descendants directs d'un noeud particulier.
  • La méthode de traversée d'arbre préordonnée vous permet de récupérer la branche entière d'un nœud particulier.

Donc, avoir id,parent_id,left,right colonnes est votre meilleur pari. Ce tutoriel contient du code entier, mais les requêtes SQL doivent être suffisamment claires.

Vous devriez être en mesure de dériver toutes les requêtes de celles fournies dans le tutoriel.

0

Je vois que vous avez déjà accepté la réponse de Eimantas, en disant que

« Donc, avoir id, id_parent, à gauche, colonne de droite est votre meilleur pari.«

Je tiens à souligner explicitement la citation suivante du lien cité (italiques):

» Ajout d'un nœud

Comment ajouter un nœud à nous l'arbre? Il existe deux approches: vous pouvez conserver la colonne parente dans votre table et simplement réexécuter la fonction rebuild_tree() - une fonction simple mais pas élégante; ou vous pouvez mettre à jour les valeurs gauche et droite de tous les nœuds sur le côté droit du nouveau nœud. "

Questions connexes