2010-07-27 7 views

Répondre

5

Vous pouvez stocker une arborescence de répertoires dans une seule table en utilisant n'importe quelle base de données SQL, en rendant la table auto-référentielle. Un bon exemple est le Windows Installer's Directory table, où vous pourrez voir une structure comme celle-ci:

  • Répertoire = champ id clé primaire, généralement un entier
  • Directory_Parent = « clé étrangère » champ id, qui pointe à l'id d'un autre répertoire dans la même table
  • Valeur = chaîne contenant le nom du répertoire/dossier

Votre table de fichiers aurait alors une clé étrangère référençant l'ID d'annuaire. Pour trouver le chemin complet, vous devez suivre la chaîne et construire le chemin à partir de la fin (à droite), en pointant chaque répertoire parent sur le devant (à gauche). Par exemple, le fichier pointe vers l'ID d'annuaire '4' avec le sous-dossier Value, puis vous récupérez la valeur du parent 'folder', puis les parents évaluent à nouveau jusqu'à la racine, en créant un chemin comme /root/folder/subfolder/filename.

+0

Y at-il un truc pour réduire le nombre de requêtes à moins de la profondeur du fichier? – cyang

+1

@cyang Aucun de ceux que je connais pour cette méthode de table auto-référentielle. Il y a, bien sûr, d'autres possibilités de conception qui seraient très différentes - par exemple, vous pourriez concevoir un système dans lequel chaque fichier recevrait un nom complexe totalement unique, et donc une seule table db serait nécessaire pour stocker le répertoire réel emplacement ... – ewall

+0

@cyang - Vous pouvez utiliser cette méthode, mais avoir un autre champ qui a eu les ID de la chaîne avec un délimiteur. Quelque chose comme 447: 33: 2: 185 pour signifier/[dossier447]/[dossier33]/[etc]/[ce dossier]. Ensuite, vous pouvez tirer un dossier donné et ses parents dans deux requêtes. Bien sûr, vous avez maintenant les frais généraux de création et de gestion de ce champ lorsque vous créez ou déplacez le répertoire, mais au moins vous n'auriez qu'à le faire une fois par la fois. Juste ne le laissez pas désynchroniser avec les parents réels. Et oui, avant que quelqu'un ne panique, ce sont des données en double. C'est ce qu'on appelle un raccourci = o) – Eli

1

C'est un arbre simple stocké en sql. Vérifiez le schéma standard parent-child ou implémentez le schéma de traversée d'arbre préordonné (gauche-droite).

2

Si votre base de données prend en charge les requêtes récursives (connexion d'Oracle ou expressions de table communes récursives standard), une table d'auto-référencement est très bien (mise à jour et interrogation facile).

Si votre SGBD ne supporte pas les requêtes hiérarchiques, alors la suggestion d'Eimantas d'utiliser un schéma de traversée d'arbre pré-ordonné est probablement la meilleure solution.

Questions connexes