Вот что я делаю:
Каждая запись в базе данных имеет два поля: ID и ParentID. Идентификаторы состоят из 4-5 символов (Base36, a-z: 0-9 или что-то подобное). Родительские идентификаторы являются объединением полной структуры родителя ...
Итак ...
Эта структура:
Root
Folder1
Folder2
Folder3
Folder4
Folder5
Folder6
Будет выглядеть так:
ID ParentID Name
0000 NULL ROOT
0001 0000 Folder1
0002 0000 Folder2
0003 00000002 Folder3
0004 0000 Folder4
0005 00000004 Folder5
0006 000000040005 Folder6
Мне нравится эта структура, потому что, если мне нужно найти все файлы в папке, я могу сделать запрос вроде:
SELECT * FROM Folders WHERE ParentID LIKE '0000%' -- to find all folders under Folder1
Чтобы удалить папку и все ее дочерние элементы:
DELETE FROM Folders WHERE ID='0004' AND ParentID LIKE '00000004%'
Чтобы переместить папку и ее дочерние элементы, необходимо обновить все записи, которые используют одного и того же родителя, до нового родительского элемента.
И я не хочу выравнивать уровни папок или подпапок
Очевидным ограничением является то, что количество подпапок ограничено размером вашего поля ParentID.