209 похожих чатов

У меня в приложухе есть возможность создавать папки и загружать

туда файлы, в бд записи папки хранится массив id-шников на файлы, а в самих файлах поле parentId указывает на папку, в которой он хранится и путь до файла
Делаю я переименование папки и прикол в том, что в бд я изменяю путь path папки, но у дочерних файлов остается старое имя и я ж не хочу пробегаться по всем дочерним файлам с помощью кучи запросов изменять path у всех, мб в данном случае можно какой-то другой подходи использовать в структуре всей этой?

25 ответов

26 просмотров

Возможно подойдёт нормализация базы данных. Для модели записи(update/insert) удобно нормализовать данные, тогда не надо бегать по всей БД и обновлять каждую запись. Для чтения(там где надо просто отдать клиенту) удобно, когда данные лежат денормализованно вместе

Maxemga- Автор вопроса
John Doe
Возможно подойдёт нормализация базы данных. Для ...

нормализовать это имеется ввиду отношения построить? Ну чтоб папка возвращала не массив id-шников, а полностью поля файлов?

Maxemga
нормализовать это имеется ввиду отношения построит...

нормализовать - привести к какой-нибудь из нормальных форм погугли нормальные формы базы данных их там много, но в большинстве случаев хватит понимания первых трех нормализация уменьшает дублирование данных и позволяет бд лучше их отслеживать но при этом, если увлечься, может ударить по перфомансу и потребовать более глубоких навыков работы с бд в среднем по больнице бд обычно приводят к 3 нормальной форме, а потом выборочно денормализуют для роста перфоманса, где это критично

Maxemga
нормализовать это имеется ввиду отношения построит...

Это придётся вам тогда все пути править, где есть переименованная папка.

Maxemga- Автор вопроса

К сожалению

Maxemga
К сожалению

Нормализация подойдёт, если вы глубину вложенности знаете, а так у вас плоская структура с parent_id. тут дело не в нормализации

Maxemga- Автор вопроса
Roman Karas` Karas'
Нормализация подойдёт, если вы глубину вложенности...

Окей, возьму на заметку Я за работу с БД не опытный, ибо я Фронтер, который лезет в бэк, поэтому глубокого понимания у меня нет)

Maxemga
К сожалению

я сам фронтендер ))

Maxemga
Окей, возьму на заметку Я за работу с БД не опытн...

Вам нада только самых близких детей. первого колена найти и поменять у них запись parent_id. Всё одним запросом можно сделать.

Можно, например: — менять путь у вложенных файлов/папок одним запросом типа update files set path = replace(path, :oldPath, :newPath) where path like :oldPath || '/' (запрос из головы, корректность не гарантируется) — реорганизовать структуру в nested sets и хранить не path, а просто name (заодно и проблема с ос-зависимыми разделителями пути уйдёт). Там можно будет одним запросом выбрать цепочку родителей или всех детей, да ну и в целом поудобнее работать с иерархией. А из минусов только менее быстрые вставка/изменение/удаление

Roman Karas` Karas'
Вам нада только самых близких детей. первого колен...

Ну точнее двумя. Один запрос найти все id у кого parent_id изменился. И второй запрос, проапдейтить эти записи

Maxemga- Автор вопроса
Roman Karas` Karas'
Ну точнее двумя. Один запрос найти все id у кого p...

Это первое что приходит в голову, да, но проблема в том что в папке может лежать другая папка файлов и так куча куча штук И вот файлы из вложенных папок не знаю Id той папки которую я изменяю или удаляю там, они лишь ссылаются на родительскую, которая уже ссылается на родительскую папку

Maxemga- Автор вопроса
Andrey Ryahovskiy
Можно, например: — менять путь у вложенных файлов/...

Спасибо за развернутый ответ, проанализирую впитаю всю информацию, но пока вижу, что вы говорите убрать path, но path то нужен чтоб обращаться к файлам в файловой системе

Maxemga
Спасибо за развернутый ответ, проанализирую впитаю...

Его строить на лету можно будет. Для конкретного фала/папки одним запросом получаем всех родителей и джойним их имена с разделителем = путь

Maxemga- Автор вопроса
Andrey Ryahovskiy
Его строить на лету можно будет. Для конкретного ф...

Звучит круто, поизучаю этот подход, спасибо

Maxemga- Автор вопроса
Roman Karas` Karas'
У вас же есть parent_id вы говорите

На примере: Есть папка в которой хранятся файлы и другие папки с файлами, файлы в других папках ссылаются на свои родительские папки (parent-I’d), а файлы которые знают parentId изменяемой папки являются лишь теми, для которых изменяемая папка валяется родителем

Maxemga- Автор вопроса
Maxemga
На примере: Есть папка в которой хранятся файлы и ...

Ой как-то слишком тяжело все и запутано, врятли понятно мое объяснение)

Maxemga- Автор вопроса
Roman Karas` Karas'
Всё так и есть

Ну вот, и если я выполню один запрос на изменение всех файлов с parentId, то поменяются лишь вложенные в папку файлы, а остальные вложенные нет, да и сейчас я понял то что это ведь не сработает все равно, у каждого файла же свой путь должен быть, а если я сделаю запрос на все файлы то у всех будет одинаковый путь (на счет этого я не уверен, мб можно написать запрос на изменение всех файлов и при этом брать у них path я хз тут, не хватает опыта)

Maxemga
Ну вот, и если я выполню один запрос на изменение ...

Смотрите, каждый файл или папка должен знать только своих родителей, у вас так и есть насколько я правильно понял.

> мб можно написать запрос на изменение всех файлов и при этом брать у них path Можно, как примерно это делается я выше писал. У update ... set можно использовать старое значение поля, есть функции преобразования строк, которыми можно старый кусок пути заменить на новый

Maxemga
Звучит круто, поизучаю этот подход, спасибо

https://stackoverflow.com/questions/19834400/what-is-the-simplest-way-to-save-a-file-tree-in-a-postgres-database

Похожие вопросы

Обсуждают сегодня

Карта сайта