Dans mon application rails, un utilisateur peut disposer d'une structure de répertoires contenant des dossiers et des fichiers dans des sous-dossiers. Quel est le meilleur moyen de stocker ces données?
En outre, quelle base de données offre le meilleur moyen de le faire?Stockage d'une structure de répertoires dans la base de données
Répondre
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
.
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).
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.
- 1. Stockage MSMQ dans la base de données
- 2. structure de la base de données
- 3. Stockage des objets polymorphes dans la base de données SQL
- 4. Type de texte de stockage dans la base de données
- 5. structure de la base de données
- 6. Stockage des tâches dans la base de données
- 7. Stockage de l'esperluette dans la base de données
- 8. Stockage de fichiers XML dans la base de données
- 9. Mysql - modifier la structure de la base de données - scénario de la base de données
- 10. Stockage de données de base avec Python
- 11. Importations de fichiers et structure des répertoires
- 12. Stockage des informations EXIF dans la base de données
- 13. Stockage et chargement du panier dans la base de données
- 14. Stockage des caractères régionaux (slovènes) dans la base de données
- 15. Stockage d'images spécifiques au profil dans la base de données
- 16. Structure de la structure XML dans le schéma de la base de données
- 17. Tableau récursif profond de la structure de répertoires dans PHP
- 18. Structure de marquage de base de données
- 19. Évaluation de la structure de la base de données système
- 20. Stockage des objets hérités dans une base de données
- 21. Stockage des paramètres sans base de données
- 22. Stockage des données de base NSAttributedString
- 23. structure du modèle de base de données
- 24. Contenu de la base de données Stockage en C# contrôle
- 25. diagramme de structure de base de données
- 26. structure de base de données magento?
- 27. comment vérifier la structure de la base de données interne
- 28. Structure de base de données simple (SQLite-)
- 29. Transfert de la structure de répertoires sur le réseau
- 30. Informations relatives au nœud dans une structure de base de données pour l'arbre Structure de données
Y at-il un truc pour réduire le nombre de requêtes à moins de la profondeur du fichier? – cyang
@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
@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