Мне надо хранить в PostgreSQL файлы пользователей но я не как не могу найти информацию об этом в документации. Как мне загружать туда файлы? И как мне организовать доступ к ним? По идее каждый пользователь может иметь файлы, соответсвенно должна быть таблица с путями? Правильно? Как такое вообще традиционно решается в случае с PostgreSQL?
-
1А зачем файлы хранить именно в БД ? – Mike Apr 26 '17 at 21:40
-
@Mike а как правильно? У меня нет такого условия что именно в БД, это показалось мне логичным. А как обычно делают? Я просто в первый раз с работой с БД сталкиваюсь так что простите за глупые вопросы если что. – Pavel Apr 26 '17 at 21:42
-
2В бд можно хранить например пути к файлам, а сами файлы просто на диске, так обычно проще. И одного совершенно правильного пути нет. тут уже могут быть нюансы – Mike Apr 26 '17 at 21:46
-
@Mike В бд можно хранить например пути к файлам, а сами файлы просто на диске обычно так делают? – Pavel Apr 26 '17 at 21:47
-
1ну зависит от того, что потом с ними происходит. Если у вас например web-приложение и файлы надо давать на скачку, то nginx файл пользователю гораздо быстрее и с меньшими накладными расходами отдаст, чем скрипт который будет тащить данные из БД и отдавать пользователю – Mike Apr 26 '17 at 21:50
-
А если вы файлы всегда будете перед передачей как то обрабатывать скриптами и они должны быть 100% согласованы с БД то может и в БД будет логичнее – Mike Apr 26 '17 at 21:53
2 Answers
Вы не можете найти информацию в документации о том, как хранить файлы в базе данных, потому что это неправильно.
Хранить можно, но зачем?
СУБД лишь абстракция над набором файлов (таблиц, индексов и т.д) Вы делаете запрос к таблице, СУБД перемещает указатель в каком-то файле, ставит какие-то блокировки, чтобы выбрать определенную запись, пишет это все в кеш..И теперь становится понятно, что база данных - это лишняя прослойка для доступа к файлам.
Файлы - при использовании по прямому назначению (отдать данные клиенту) всегда быстрее, чем хранение в базе данных, потому что требуется меньше процедур, чтобы их прочитать.
Если вы храните файлы в базе данных, вы забивайте кеш, который должен использоваться для других запросов. Со временем, база данных разрастается, процессы которые отдают файлы забивают свободный пул, возрастает нагрузка и используемое место, вам требуется уже шардинг и другие ненужные процедуры.
Для реализации файлового хранилища, храните адрес сервера (если их несколько) и полный путь к файлу на сервере в таблице и отдавайте файлы через nginx.
P.S Иногда есть логическое обоснование хранения файлов в БД, но к сожалению, это маленький процент общих вариантов.
- 9,352
Прежде всего - я полностью согласен, что хранить файлы в базе данных сугубо специфичная задача. В 99% такая мысль приводит только к осложнениям. Соxраняйте пути, имена, метаинфо и прочая в дб, а сами файлы на ФС, S3 или cloud. Однако это не ответ на ваш вопрос.
- Как мне загружать туда файлы?
lo_import - И как мне организовать доступ к ним?
lo_export - должна быть таблица с путями?
pg_largeobject - Как такое вообще традиционно решается в случае с PostgreSQL? читайте документацию
также посмотрите как это сделать с помощью psql и ещё раз подумайте - оно вам надо?
- 286