туда файлы, в бд записи папки хранится массив id-шников на файлы, а в самих файлах поле parentId указывает на папку, в которой он хранится и путь до файла
Делаю я переименование папки и прикол в том, что в бд я изменяю путь path папки, но у дочерних файлов остается старое имя и я ж не хочу пробегаться по всем дочерним файлам с помощью кучи запросов изменять path у всех, мб в данном случае можно какой-то другой подходи использовать в структуре всей этой?
Возможно подойдёт нормализация базы данных. Для модели записи(update/insert) удобно нормализовать данные, тогда не надо бегать по всей БД и обновлять каждую запись. Для чтения(там где надо просто отдать клиенту) удобно, когда данные лежат денормализованно вместе
нормализовать это имеется ввиду отношения построить? Ну чтоб папка возвращала не массив id-шников, а полностью поля файлов?
нормализовать - привести к какой-нибудь из нормальных форм погугли нормальные формы базы данных их там много, но в большинстве случаев хватит понимания первых трех нормализация уменьшает дублирование данных и позволяет бд лучше их отслеживать но при этом, если увлечься, может ударить по перфомансу и потребовать более глубоких навыков работы с бд в среднем по больнице бд обычно приводят к 3 нормальной форме, а потом выборочно денормализуют для роста перфоманса, где это критично
Это придётся вам тогда все пути править, где есть переименованная папка.
К сожалению
Нормализация подойдёт, если вы глубину вложенности знаете, а так у вас плоская структура с parent_id. тут дело не в нормализации
Окей, возьму на заметку Я за работу с БД не опытный, ибо я Фронтер, который лезет в бэк, поэтому глубокого понимания у меня нет)
я сам фронтендер ))
Вам нада только самых близких детей. первого колена найти и поменять у них запись parent_id. Всё одним запросом можно сделать.
Можно, например: — менять путь у вложенных файлов/папок одним запросом типа update files set path = replace(path, :oldPath, :newPath) where path like :oldPath || '/' (запрос из головы, корректность не гарантируется) — реорганизовать структуру в nested sets и хранить не path, а просто name (заодно и проблема с ос-зависимыми разделителями пути уйдёт). Там можно будет одним запросом выбрать цепочку родителей или всех детей, да ну и в целом поудобнее работать с иерархией. А из минусов только менее быстрые вставка/изменение/удаление
Ну точнее двумя. Один запрос найти все id у кого parent_id изменился. И второй запрос, проапдейтить эти записи
Это первое что приходит в голову, да, но проблема в том что в папке может лежать другая папка файлов и так куча куча штук И вот файлы из вложенных папок не знаю Id той папки которую я изменяю или удаляю там, они лишь ссылаются на родительскую, которая уже ссылается на родительскую папку
Спасибо за развернутый ответ, проанализирую впитаю всю информацию, но пока вижу, что вы говорите убрать path, но path то нужен чтоб обращаться к файлам в файловой системе
Его строить на лету можно будет. Для конкретного фала/папки одним запросом получаем всех родителей и джойним их имена с разделителем = путь
Звучит круто, поизучаю этот подход, спасибо
У вас же есть parent_id вы говорите
На примере: Есть папка в которой хранятся файлы и другие папки с файлами, файлы в других папках ссылаются на свои родительские папки (parent-I’d), а файлы которые знают parentId изменяемой папки являются лишь теми, для которых изменяемая папка валяется родителем
Ой как-то слишком тяжело все и запутано, врятли понятно мое объяснение)
Ну вот, и если я выполню один запрос на изменение всех файлов с parentId, то поменяются лишь вложенные в папку файлы, а остальные вложенные нет, да и сейчас я понял то что это ведь не сработает все равно, у каждого файла же свой путь должен быть, а если я сделаю запрос на все файлы то у всех будет одинаковый путь (на счет этого я не уверен, мб можно написать запрос на изменение всех файлов и при этом брать у них path я хз тут, не хватает опыта)
всё понятно вы объяснили )
Смотрите, каждый файл или папка должен знать только своих родителей, у вас так и есть насколько я правильно понял.
> мб можно написать запрос на изменение всех файлов и при этом брать у них path Можно, как примерно это делается я выше писал. У update ... set можно использовать старое значение поля, есть функции преобразования строк, которыми можно старый кусок пути заменить на новый
https://stackoverflow.com/questions/19834400/what-is-the-simplest-way-to-save-a-file-tree-in-a-postgres-database
Обсуждают сегодня