2010-07-27 3 views
7

В моем приложении rails пользователь может иметь структуру каталогов, в которой есть папки и файлы в подпапках. Каков наилучший способ хранения таких данных?
Кроме того, какая база данных предлагает лучший способ сделать это?Сохранение структуры каталогов в базе данных

ответ

5

Вы можете сохранить дерево каталогов в одной таблице с использованием любой базы данных SQL, сделав таблицу самореферентной. Хорошим примером является Windows Installer's Directory table, где вы увидите структуру, как это:

  • Каталог = первичный ключ идентификатор поля, как правило, целое число
  • Directory_Parent = «внешний ключ» поле идентификатор, который указывает к идентификатору другого каталога в той же таблице
  • Value = строка, содержащая имя каталога/папки

Ваша таблица файлов будет иметь внешний ключ, ссылающийся на идентификатор каталога. Чтобы найти полный путь, вы должны следить за цепочкой и строить путь от конца (справа), привязывая каждую родительскую директорию к фронту (слева). Например, файл будет указывать на идентификатор каталога «4» с подпапкой «Значение», затем вы получите значение «папка» родителя, а затем родительское значение снова, пока не дойдете до корня, создав путь, например, /root/folder/subfolder/filename.

+0

Есть ли какой-либо трюк, чтобы уменьшить количество запросов меньше глубины файла? – cyang

+1

@cyang Нет, что я знаю для этого метода самореференциальной таблицы. Конечно, существуют и другие возможности дизайна, которые выглядели бы совсем по-другому: например, вы могли бы разработать систему, в которой каждый файл получит совершенно уникальное сложное имя, и, таким образом, для хранения фактического каталога потребуется только одна таблица db location ... – ewall

+0

@cyang - Вы можете использовать этот метод, но есть другое поле с идентификаторами вверх по цепочке с разделителем. Что-то вроде 447: 33: 2: 185, чтобы обозначить/[folder447]/[folder33]/[и т. Д.]/[Эта папка]. Затем вы можете вытащить заданную папку и ее родителей в два запроса. Конечно, теперь у вас есть накладные расходы на создание и управление этим полем при создании или перемещении каталога, но по крайней мере вам нужно будет делать это только один раз за раз. Просто не позволяйте ему не синхронизироваться с фактическими родителями. И да, прежде чем кто-либо выйдет из строя, это дубликаты данных. Это называется shortcut = o) – Eli

1

Это простое дерево, хранящееся в sql. Либо проверьте стандартную схему parent-child, либо реализуйте схему упорядоченного обхода дерева (слева направо).

2

Если ваша база данных поддерживает рекурсивные запросы (либо подключение Oracle к стандартным рекурсивным общим табличным выражениям), то таблица саморефлексирования (она легко обновляется и запрашивается).

Если ваша СУБД не поддерживает иерархические запросы, то, вероятно, наилучшим способом является предложение Eimantas использовать схему упорядоченного обхода дерева.

Смежные вопросы