В моем приложении rails пользователь может иметь структуру каталогов, в которой есть папки и файлы в подпапках. Каков наилучший способ хранения таких данных?
Кроме того, какая база данных предлагает лучший способ сделать это?Сохранение структуры каталогов в базе данных
ответ
Вы можете сохранить дерево каталогов в одной таблице с использованием любой базы данных SQL, сделав таблицу самореферентной. Хорошим примером является Windows Installer's Directory table, где вы увидите структуру, как это:
- Каталог = первичный ключ идентификатор поля, как правило, целое число
- Directory_Parent = «внешний ключ» поле идентификатор, который указывает к идентификатору другого каталога в той же таблице
- Value = строка, содержащая имя каталога/папки
Ваша таблица файлов будет иметь внешний ключ, ссылающийся на идентификатор каталога. Чтобы найти полный путь, вы должны следить за цепочкой и строить путь от конца (справа), привязывая каждую родительскую директорию к фронту (слева). Например, файл будет указывать на идентификатор каталога «4» с подпапкой «Значение», затем вы получите значение «папка» родителя, а затем родительское значение снова, пока не дойдете до корня, создав путь, например, /root/folder/subfolder/filename
.
Это простое дерево, хранящееся в sql. Либо проверьте стандартную схему parent-child
, либо реализуйте схему упорядоченного обхода дерева (слева направо).
Если ваша база данных поддерживает рекурсивные запросы (либо подключение Oracle к стандартным рекурсивным общим табличным выражениям), то таблица саморефлексирования (она легко обновляется и запрашивается).
Если ваша СУБД не поддерживает иерархические запросы, то, вероятно, наилучшим способом является предложение Eimantas использовать схему упорядоченного обхода дерева.
- 1. Сохранение структуры данных в базе данных MySql с использованием F #
- 2. Передача структуры каталогов по сети
- 3. Сохранение в базе данных
- 4. Сохранение и получение структуры JSon в базе данных
- 5. Сохранение объекта/структуры в базе данных как Json
- 6. iOS: сохранение структуры данных
- 7. Переадресация/Переписывание в подпапку, но сохранение структуры каталогов в IIS
- 8. Лучший вид структуры данных для репликации структуры каталогов в Java?
- 9. Сохранение структуры каталогов заголовков в Xcode для статической библиотеки
- 10. Сохранение структуры каталогов при создании базы в Xcode
- 11. Сохранение структуры данных в базах данных SQL
- 12. Сохранение currentDate в базе данных
- 13. Сохранение изображения в базе данных
- 14. Сохранение сеансов в базе данных
- 15. Сохранение изображений в базе данных
- 16. Сохранение HTML в базе данных
- 17. Сохранение массива в базе данных?
- 18. Сохранение C++ в базе данных
- 19. Сохранение строки в базе данных
- 20. Сохранение амперсанда в базе данных
- 21. Сохранение изображений в базе данных
- 22. Сохранение изображения в базе данных
- 23. Сохранение сигналов в базе данных
- 24. Сохранение значений в базе данных
- 25. Сохранение списка в базе данных
- 26. Сохранение значений в базе данных
- 27. Сохранение изображения в базе данных
- 28. jEditable - сохранение в базе данных
- 29. Сохранение Java в базе данных
- 30. Сохранение очередей в базе данных
Есть ли какой-либо трюк, чтобы уменьшить количество запросов меньше глубины файла? – cyang
@cyang Нет, что я знаю для этого метода самореференциальной таблицы. Конечно, существуют и другие возможности дизайна, которые выглядели бы совсем по-другому: например, вы могли бы разработать систему, в которой каждый файл получит совершенно уникальное сложное имя, и, таким образом, для хранения фактического каталога потребуется только одна таблица db location ... – ewall
@cyang - Вы можете использовать этот метод, но есть другое поле с идентификаторами вверх по цепочке с разделителем. Что-то вроде 447: 33: 2: 185, чтобы обозначить/[folder447]/[folder33]/[и т. Д.]/[Эта папка]. Затем вы можете вытащить заданную папку и ее родителей в два запроса. Конечно, теперь у вас есть накладные расходы на создание и управление этим полем при создании или перемещении каталога, но по крайней мере вам нужно будет делать это только один раз за раз. Просто не позволяйте ему не синхронизироваться с фактическими родителями. И да, прежде чем кто-либо выйдет из строя, это дубликаты данных. Это называется shortcut = o) – Eli