2013-03-20 7 views
2

Je dois stocker un arbre hiérarchique dans une base de données SQL. Après une recherche ici sur le site j'ai trouvé quelques solutions, mais j'ai encore besoin d'aide. En bref, j'ai des "entrées" qui doivent être routées vers les sorties, en fonction du type de signal d'entrée, de l'endroit dans l'arbre et de l'heure. Pour le rendre un peu plus complexe, j'ai l'exigence qu'il devrait fonctionner avec MSSQL Server 2005, MySQL et SQL lite. Peut-être que je peux abandonner l'exigence SQL Lite à un moment donné, mais pour l'instant je dois y faire face.Arbre hiérarchique dans la base de données SQL - différents types de serveurs de base de données

L'action la plus courante sur l'arborescence est que je dois rechercher de bas en haut le nœud racine pour un nœud avec des informations attachées à celui-ci. La façon la plus simple de mettre en œuvre cela me semble de créer une table avec des références au parent et en sélectionnant d'abord le nœud inférieur, vérifier si l'information y est attachée; sinon sélectionnez le parent et répétez.

Bien que simple et ne nécessite aucune fonctionnalité de base de données spéciale, il nécessite de nombreuses requêtes. Jusqu'à 6 niveaux d'imbrication de nœuds seront communs, au plus 14 niveaux sont attendus. L'information qui est attachée à un nœud contient un certain temps (période de jour/semaine) dépend du lien entre un type d'entrée et la sortie que je dois trouver. Ci-dessous un exemple; lorsque l'entrée 1 sur "Node 4" est activée, je veux trouver que la sortie doit être "4", si l'entrée 8 est activée sur le même nœud, la sortie devrait être "0". **image link**

où je dois chercher plus d'informations de fond sur ce type de structures ou est-ce que quelqu'un a une idée comment concevoir la structure de base de données pour ce problème?


Edit:

En réponse à la réponse de Young Bob Je vais faire un test. Mais si quelqu'un a une idée pour moi de faire un choix (...) s'il n'existe pas répéter pour parent, et ainsi de suite dans une requête, je suis très intéressé.

Répondre

0

Je vous recommande de lire le travail de Joe Celko sur les ensembles imbriqués. Voir SQL - How to store and navigate hierarchies? pour la discussion et les liens utiles

+0

Merci. J'ai déjà trouvé ce post avant. Mais il y a beaucoup d'options, de liens et de suggestions sur ce post. Un peu trop pour que je surveille la direction à suivre. Avez-vous une solution spécifique en tête? – Lukas

+0

Meilleur expliqué ici http://en.wikipedia.org/wiki/Nested_set_model. Fondamentalement, ainsi que tous les nœuds ayant un parent, il y a aussi un champ "Left" et "Right". Ces valeurs sont initialement assignées en séquence en traversant l'arbre le plus à gauche et le plus bas dans l'ordre afin que root.Left soit 1, node1.Left est 2, etc. et vous vous retrouvez avec root.Right = (nombre de nœuds) * 2. Un nœud est un ancêtre (parent, grand-parent, etc.) de notre nœud enfant si la valeur Left du nœud enfant se situe entre la valeur Left et Right du nœud (de l'ancêtre). L'ancêtre le plus proche a la plus grande valeur de gauche - donc pas de multiples jointures ou itérations impliquées. –

+0

Je devrais ajouter ... cette approche donne des recherches très rapides l'inconvénient est d'avoir à mettre à jour les valeurs gauche et droite dans l'arbre entier chaque fois que la hiérarchie change ce qui pourrait être un problème si l'arbre est très grand et fréquemment changé. –

Questions connexes