2010-08-02 9 views
3

Je vais essayer d'exposer le plus clair possible;)DB Conception: les meilleures pratiques à la structure hiérarchique

Eh bien, je dois stocker des données qui peuvent être linket eux-mêmes comme le parent> relation enfant, sans -limite profonde.

Mon premier essai était:

entry_id | parent_id | value 
    1 | NULL | Foo //foo is the grand parent 
    2 | 1  | Bar //bar is child of Foo 
    3 | 1  | Baz //baz too 
    4 | 2  | Bho //bho is child of Bar 
    5 | 4  | Som //som is child of Bho 
    6 | NULL | Git //another grand parent 
    7 | 6  | Tim //Git's child 

..et ainsi de suite.

Cette structure fonctionne, mais il est impossible (ou du moins, je ne pouvais pas passer par-là) trouver tous les enfants Foo et 'sub-childs' avec seulement 1 requête .. cela nécessite une boucle.

Mon but est d'avoir une structure optimisée pour la requête SELECT, qui peut me donner toutes les relations d'un seul coup, quelque chose comme:

SELECT "ALL SONS OF Bar" 

sortie:

entry_id | parent_id | value 
    1  | NULL | Bar 
    4  | 2  | Bho 
    5  | 4  | Som 

mais cette structure ne marche pas semble me laisser faire ça.

Toute idée?

Si peut importe, je vais courir sur Postgresql (je pensais utiliser le type de champs de tableau, mais la requête ne sera pas beaucoup plus rapide)

Modifier pour le commentaire philip: dans mon spécifique, le shouldnt de données changer trop souvent, mais j'aurai probablement besoin d'utiliser cette structure pour d'autres tâches similaires - mais pas égales - où les données peuvent être mises à jour plusieurs fois.

Comme une note de côté, à l'aide des clés étrangères (ou un comportement similaire) sera le meilleur (suppression on devrait supprimer « père » tous les Childs - pas orphelins sont autorisés)

+0

À quelle fréquence le changement de données, et comment cela va changer (ajouter, branches leafs d'échange, supprimer des nœuds du milieu/traiter les orphelins, etc., etc., etc.). Des systèmes plus simples peuvent permettre des raccourcis, mais si vous avez besoin d'une grande flexibilité, les choses peuvent devenir compliquées. –

+1

La valeur 0 est erronée, il n'y a pas d'ID d'entrée avec cette valeur: toute contrainte de clé étrangère échouera. Utilisez une valeur NULL lorsque vous n'avez pas de parent. –

+0

@frank: vous avez raison. – Strae

Répondre

10

Je pense que vous pourriez bénéficier de la lecture . Il indique comment transformer une table plate en une hiérarchie avec juste quelques attributs et un peu de ménage. Même si vous n'allez pas faire comme ça, c'est perspicace. Pour PostgreSQL, vous pouvez le faire avec WITH RECURSIVE requêtes: WITH Queries (Common Table Expressions).
Vous avez besoin d'au moins la version 8.4 pour les utiliser.

+1

+1 pour la fonction WITH RECURSIVE. – rfusca

4

Bill Karwin a fait une belle présentation sur les données hiérarchique:

http://www.slideshare.net/billkarwin/models-for-hierarchical-data

Et comme jmz déjà dit, les requêtes récursives sont un solveur réel problème.

+1

Si vous regardez le diaporama, portez une attention particulière au modèle de jeu imbriqué. Notez également que la liste d'adjacence est votre conception. –

Questions connexes