2010-02-23 3 views
3

Je travaille sur la construction d'une structure arborescente dans MySQL et j'ai expérimenté différentes manières de représenter les données. Cependant, peu importe comment je le tranche, il y a des lacunes.Est-il considéré comme un mauvais design de combiner le modèle de liste d'adjonction et le modèle de jeu imbriqué?

Le modèle des ensembles imbriqués me permet de sélectionner facilement des branches entières de l'arbre - ce que je dois faire. Cependant, il n'est pas si facile de sélectionner les enfants immédiats d'un nœud.

Le modèle de liste d'adjacence est idéal pour obtenir des enfants immédiats, mais pas aussi bon pour renvoyer des branches entières de l'arbre.

Je me demande, est-il quelque chose de particulièrement mauvais au sujet de la construction d'une structure arborescente comme ceci:

TABLE: Tree 
    ID 
    name 
    lft 
    rgt 
    parentID 

Donc ce que j'ai est le modèle de liste de contiguïté et le modèle des ensembles imbriqués dans la même table. De cette façon, je peux utiliser l'un ou l'autre, selon les circonstances de ce que je choisis.

Quelles sont les pensées des gens? Est-ce autorisé? (Le beurre d'arachide et le chocolat ensemble enfin?) Ou est-ce considéré comme un mauvais design?

Merci à l'avance,

+0

avez-vous également envisagé de construire une fermeture transitive? – barkmadley

Répondre

1

Je le recommande vivement. C'est le style que CakePHP utilise pour ses structures arborescentes, et comme vous l'avez souligné, cela vous donne une grande flexibilité. Vous avez juste besoin de faire un peu plus de travail pour assurer l'intégrité de votre arbre, mais ça en vaut vraiment la peine.

1

Non, ce ne est pas une mauvaise conception du tout. Au moins à mon avis.

Je n'en mettrais toutefois qu'un seul en place. Par exemple, j'ai utilisé le modèle de liste d'adjacence comme méthode principale d'ajout de nouveaux éléments et de retreivage. (Évidemment, il s'agit d'une nouvelle version car c'est très facile). Cependant, j'ai ajouté parentIds pour Nested Set. L'avantage de ceci est que je peux reconstruire mon ALM à tout moment et peut facilement déplacer des choses rapidement à condition que je garde les parentIds.

Je ne voudrais pas utiliser à la fois dans votre code cependant, viennent là en arrière-plan ...

Commentaires Edité

Vous mentionnez qu'il est pas si facile de sélectionner les enfants immédiats. Je pense que vous pourriez faire quelque chose de mal. Il est extrêmement facile même dans la liste d'adjacence pour sélectionner les enfants immédiats.

Si vous créez une nouvelle question, je vais vous répondre comment y arriver.

+0

Eh bien, je dois faire un peu plus que sélectionner des enfants immédiats ... Si je fais correspondre un ensemble de noeuds en utilisant LIKE, j'ai besoin de sélectionner chacun de ces noeuds, une liste comma-delimmited des enfants immédiats de chacun de ces noeuds et une liste des ancêtres de chacun de ces noeuds. (!!!) J'espère pouvoir le faire en un seul SQL si possible. Bien sûr, je posterai cela comme une nouvelle question. Se sentir à la hauteur d'un défi, sourire? :) – Travis

+0

Si vous fournissez suffisamment d'informations, je vais jeter un coup d'oeil. Mais il semble assez difficile d'après votre brève description ci-dessus. – Layke

+0

Merci, j'apprécie votre aide. J'ai posté la question. – Travis

Questions connexes