BLOB или ссылки в PostgreSQL

11

Мне нужно хранить двоичные файлы данных в базе данных PostgreSQL, которая работает на сервере Ubuntu. Первоначально будет несколько десятков файлов размером примерно 250 КБ каждый. Однако количество файлов со временем будет увеличиваться. Иногда мне может понадобиться извлечь данные из файлов для других последующих анализов.

Я провел некоторое исследование относительно давнего вопроса хранения двоичных данных в виде BLOB или ссылок. У обоих явно есть свои плюсы и минусы. Есть ли какие-то конкретные проблемы, связанные с PostgreSQL, о которых мне следует знать? Один метод или другой предпочтительнее, если я хочу извлечь данные из файлов, либо с помощью функции PostgreSQL, либо с помощью внешней программы Python?

Если бы я должен был хранить файлы данных непосредственно в базе данных, было бы лучше хранить их в отдельной таблице с внешним ключом, ссылающимся на «главную» таблицу, а не в таблицу, содержащую все остальные поля?

Я прочитал вопрос и ответы здесь ; комментарий там предполагает, что лучше хранить бинарные файлы по ссылке (в файловой системе) в Linux. Мои вопросы здесь касаются конкретно PostgreSQL и извлечения данных из файлов для различных анализов.

Обновление: аналогичный вопрос .

SabreWolfy
источник
С PostgreSQl можно настроить правило, которое автоматически удаляет файл в файловой системе при удалении записи, содержащей ссылку.
JP
Я уверен, что было больше, чем один ответ на этот вопрос. Что с ним случилось? Есть ли способ увидеть это, если постер удалил это? Как насчет комментариев к нему?
SabreWolfy
Да, я удалил его, поскольку проблем с производительностью с bytea, о котором я писал, можно избежать. Комментарии можно обобщить так: «С bytea все в порядке, вы должны просто убедиться, что вы не избегаете непечатных символов в базе данных, а затем снова не экранировать их в своем приложении. Как прокомментировал araqnid, вы должны вместо этого использовать шестнадцатеричное экранирование, поддерживаемое libpq. "
JP

Ответы:

9

Я думаю, что вы должны хранить данные в базе данных как обычный byteaстолбец. Таким образом, вы получаете все преимущества базы данных и можете обрабатывать данные, используя функции базы данных (и даже PL / Python, если хотите). Более крупные элементы данных будут автоматически сохраняться вне строки, поэтому у вас не будет причин вводить другую ссылочную косвенность.

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

Питер Айзентраут
источник
Спасибо за подробности. Ваше мнение о доступе к файлам из отдельного приложения привело меня к пониманию того, что в будущем я, возможно, захочу разрешить пользователям загружать двоичный файл для локального использования на их компьютере. Можно ли это сделать, если файл хранится в базе данных?
SabreWolfy
Конечно. Вам нужно будет написать небольшой кусочек кода для этого (выборка данных файла из базы данных, скажем, организация HTTP-загрузки), но это не является блокировщиком.
Питер Айзентраут