8
votes

Stockage d'une structure de répertoires dans la base de données

Dans My Rails App, un utilisateur peut avoir une structure de répertoire comportant des dossiers et des fichiers dans les sous-dossiers. Quel est le meilleur moyen de stocker de telles données ?? En outre, quelle base de données offre la meilleure façon de le faire?


0 commentaires

3 Réponses :


1
votes

C'est un arbre simple stocké dans SQL. Soit vérifier le standard Scheme-enfant ou implémenter le schéma trershavation pré-commandé (gauche-droite).


0 commentaires

7
votes

Vous pouvez stocker une arborescence de répertoires dans une seule table à l'aide de n'importe quelle base de données SQL en faisant le tableau auto-référentiel. Un bon exemple est le Table répertoire de Windows Installer , où vous verrez une structure comme celle-ci:

  • répertoire = champ d'identité clé principal, typiquement un entier
  • répertoire_parent = "clé étrangère", qui pointe vers l'ID d'un autre répertoire dans la même table
  • valeur = chaîne contenant le nom Directory / Dossier

    Votre table de fichiers aurait alors une clé étrangère faisant référence à l'ID d'annuaire. Pour trouver le chemin complet, vous devez le suivre la chaîne et construire le chemin de la fin (à droite), associer chaque répertoire parent sur le devant (à gauche). Par exemple, le fichier pointerait sur l'ID d'annuaire «4» avec la valeur «Sous-dossier», puis vous récupérez le «dossier» du parent, puis les parents à nouveau jusqu'à ce que vous arriviez à la racine, créant un chemin comme / racine / dossier / sous-dossier / nom de fichier .


3 commentaires

Y a-t-il des astuces pour réduire le nombre de requêtes à moins que la profondeur du fichier?


@cyang aucune que je connaisse pour cette méthode de table auto-référentielle. Il existe bien sûr d'autres possibilités de conception qui sembleraient assez différentes - par exemple, vous pouvez concevoir un système dans lequel chaque fichier obtient un nom complexe totalement unique et que seule une seule table DB serait donc nécessaire pour stocker le répertoire réel. emplacement...


@cyang - Vous pouvez utiliser cette méthode, mais avoir un autre champ qui avait l'identifiant la chaîne avec un délimiteur. Quelque chose comme 447: 33: 2: 185 pour signifier / [folder447] / [folder33] / [etc] / [Ce dossier]. Ensuite, vous pouvez tirer un dossier donné et ses parents dans deux questions. Bien sûr, vous avez maintenant les frais généraux de la création et de la gestion de ce champ lorsque vous créez ou déplacez le répertoire, mais au moins vous ne devriez le faire qu'une fois par heure. Juste ne le laissez pas sortir de la synchronisation avec les parents. Et oui, avant que quiconque ne disparaisse, c'est des données en double. Ça s'appelle un raccourci = o)



2
votes

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

Si votre SGBD ne prend pas en charge les requêtes hiérarchiques, la suggestion d'Eimantas à utiliser un schéma de traversé pré-commandé est probablement la meilleure solution.


0 commentaires