У меня есть система файлов и папок. В данном контексте - папка и файл некое структурированное значение в БД. Я хочу сделать удаление папки. Для этого мне нужно узнать все ID файлов и папок, которые могут находится внутри удаляемой папки.
Моя таблица folders:
id folder_id 1 0
Моя таблица files
id folder_id 1 0
Например папка folder_id 90 может находится в folder_id 100, а та в свою очередь может находится в десятках других.
Как мне получить все связанные таким образом значения из таблицы mySQL методами php ?
Есть несколько способов хранения иерархических структур в БД:
Adjacency List («список смежности») Для каждой записи хранится id родителя. Вся ветка вычисляется рекурсивными запросами. Подходит для небольшой вложенности. Требуется много запросов к бд
Materialized Path («материализованный путь») В каждой записи хранится длинная строка, содержащая все id родителей с неким разделителем
Nested Sets («вложенные множества») В каждой записи хранится пара колонок lft и rgt, хранящие диапазон всех вложенных элементов. Можно быстро получить всю ветку, но много накладных расходов на вставку новой записи или перемещение её между ветками.
Closure Table («таблица связей») В отдельной таблице хранятся все связи родитель-потомок. Быстрое получение нужной ветки, но большое кол-во записей связей. Сложности с выводом отсортированного дерева
Существует множество реализаций данных алгоритмов как в php, так и непосредственно в хранимых процедурах mySQL.
Преимущества и недостатки каждого из способов надо рассматривать вместе с требованиями к конкретному проекту
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости