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

А если серьезно. Лучше хранить файлы в папках и держать

ссылки в постгрес? Или держать все в байнари в самом постгрес?

13 ответов

25 просмотров

Чаще всего лучше отдельно. Т.е. чтобы хранить внутри - надо очень точно знать зачем вам это надо.

правильнее держать в постгресе, а лучше - снаружи:)

Если вам не нужна транзакционность и единый способ бекапа для данных базы и файлов в базе вам по плечу то ОК.

В принцыпе, некоторые минусы в том, чтобы держать файлы в постгресе -- есть. Начиная с того, что постгрес и так работает поверх файлов, и лишний уровень только добавляет тормозов, обычно без какой-либо пользы. Кроме того, там лимит на размер файл в гигабайт -- это мало. Ну, в смысле -- если просто делать -- то лимит будет в гигабайт. К тому жэ, на самом деле, оно ещё и гигабайт-то выберет относительно неспешно -- все эти преобразования в формат протокола и обратно... Но, с другой стороны, никаких совсем приныпиальных противоречий с тем, чтобы в базе были файлы -- нет. И это, в общем, вполне нормально решэние.

Emirlan Rasulov
Ладно спасибо

Да у меня на горизонте маячит организация хранилища файлов, потому тоже очень интересен этот вопрос:)

Ilya Anfimov
В принцыпе, некоторые минусы в том, чтобы держать ...

С другой стороны по через хранимки и plproxy организовать горизонтально масштабируемое хранилище файлов в ПГ - ну оно таки рабочее решение. А распределённые хранилища - они, в своём большинстве используют СУБД для хранения метаинформации. И запись в эти хранилища - ну совсем не быстрая.

Eshu Marabo
А в чем минус храния файлов в постгресе?

В Постгресе нет нормальных BLOB-ов. Есть TOAST - нём большие записи наслайсены на кусочки по 2kb, которые лежать в отдельной таблице. Т.е. когда вы извлекаете файл из постгреса, вы по сути делаете select * from xxx_toast where obj_id=? order by toast_id; Очевидно, что не самый эффективный способ получения файла. Опять таки - зачем вам этот файл нужен. Чтобы отдать наружу через HTTP сервер? Ну так последний как раз и так прекрасно умеет отдавать файлы ... при условии,что это файлы. А не результат запроса к базе.

Михаил Шурутов
С другой стороны по через хранимки и plproxy орган...

Ну, там всё-таки обычно другого типа "распределённые". А такие, как через plproxy -- обычно делаются шардированием, которое в файловой системе очень естественное. Кроме того, часто раздача файлов с одной ноды досутпна со скоростью сети примерно (дажэ диски часто менее ограничивают, поскольку самое актуальное в кэшах в RAM). То есть десятки гигабит на такой очень умеренный сервер. СУБД до такого далеко обычно.

Это от задачи зависит. Иногда так лучше, иногда наоборот

Я храню либо в aws s3, либо в Minio (s3-совместимое хранилище). В базе, соответственно, держу ключи файлов только. Например, df3/a3bd4a.jpg. При отдаче юзеру в простейшем случае можно дописывать спереди префикс с доменом. Например: https://blabla.ru/media/df3/a3bd4a.jpg

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта