web-dev-qa-db-fra.com

Comment représenter un arbre comme une structure dans une base de données

Je commence un projet et je suis en phase de conception: c'est-à-dire, je n'ai pas encore décidé du framework de base de données que je vais utiliser. Je vais avoir un code qui crée une "forêt" comme structure. Autrement dit, de nombreux arbres, où chaque arbre est une norme: les nœuds et les arêtes. Une fois que le code a créé ces arbres, je souhaite les enregistrer dans la base de données. (puis retirez-les éventuellement)

L'approche naïve pour représenter les données dans la base de données est une base de données relationnelle avec deux tables: noeuds et arêtes. C'est-à-dire que la table des nœuds aura un identifiant de nœud, des données de nœud, etc. Et la table des contours sera un mappage d'identificateur de nœud à identificateur de nœud. 

Est-ce qu'il y a une meilleure approche? Ou étant donné les hypothèses (limitées) que je donne, c'est la meilleure approche? Que diriez-vous si nous ajoutons une hypothèse selon laquelle les arbres sont relativement petits? Est-il préférable de sauvegarder l’arbre entier sous forme de goutte dans la base de données? Quel type de base de données devrais-je utiliser dans ce cas? Veuillez commenter sur la vitesse/l'évolutivité. 

Merci

28
Guy

Dans ma réponse à la question StackOverflow, j’ai présenté une solution similaire à vos tables de nœuds et d’arêtes: Quel est le moyen le plus efficace/élégant d’analyser une table plate dans un arbre? J'appelle cette solution "Table de fermeture".

J'ai fait une présentation sur différentes méthodes de stockage et d'utilisation d'arbres dans SQL, Modèles pour données hiérarchiques avec SQL et PHP . J'ai démontré qu'avec les bons index (en fonction des requêtes à exécuter), la conception de la table de fermeture peut offrir de très bonnes performances, même sur de grandes collections d'arêtes (environ 500 000 arêtes dans ma démo).

J'ai également abordé la conception dans mon livre, Antipatterns SQL: éviter les pièges de la programmation par base de données .

18
Bill Karwin

Veillez à utiliser une sorte de codage de bas niveau pour l'entité traitée afin d'éviter les boucles. L'entité peut être une pièce, un sujet, un dossier, etc.

Avec un fichier Entity et un fichier Entity-Xref, vous pouvez parcourir l'une des deux relations entre les deux fichiers, une relation parent et une relation enfant.

Un niveau est le niveau qu'une entité trouve dans un arbre. Un code de bas niveau pour l'entité est le niveau le plus bas qu'une entité trouve dans n'importe quel arbre. Assurez-vous que le code de bas niveau de l'entité que vous voulez transformer en enfant est inférieur ou égal pour empêcher une boucle. après avoir ajouté une entité enfant, il sera abaissé d’un niveau au moins.

1
eric