Какие существуют способы хранения файлов в sql базах данных?

Как лучше хранить файлы в sql базе данных? Хранить сами файлы(картинки, текстовые файлы, аудио файлы) или хранить в базе сслыку на эти файлы в системе? Каким способом лучше реализовать тот или иной способ?


Ответы (4 шт):

Автор решения: Sergei Kirjanov

Для больших файлов лучше хранить ссылку.

Для самих файлов можно использовать s3 (ceph, minio) кластер, для масштабируемости/надежности.

→ Ссылка
Автор решения: Aziz Umarov

Давай попробую ответить.

Смысл хранить данные в базе имеется только если с ними работать на прямую.

Например: у вас есть модуль/функция который который может найти, определить, сгруппировать файлы по содержимому по типу плагият или нет. Или какой нибудь по типу google картинок который находит схожие изображения. Короче говоря вы будите использовать содержимое.

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

→ Ссылка
Автор решения: Alexander Petrov

Что ж за ответы такие однобокие?
Хотя, вопрос так составлен. Без уточнения конкретной СУБД и без уточнения, что именно будет делаться с хранимыми данными.

Кроме двух упомянутых способов - хранение ссылки или самих данных в БД - есть и другие.
Например, в Sql Server есть FILESTREAM - он сочетает в себе преимущества обоих: хранит данные в файловой системе, обеспечивает транзакционную согласованность и быструю передачу.

→ Ссылка
Автор решения: Barmaley

Не касаясь вопроса а_на_фига_это_вообще_надо отвечу на прямой вопрос:

Какие существуют способы хранения файлов в sql базах данных?

За все способы не скажу, но я лично использовал такой способ:

  1. Заголовочная таблица с метаданными файла, поля типа:
  • Идентификатор файла
  • Название файла
  • mime тип файла
  • размер файла
  • timestamp'ы lastmodified/created
  • checksum файла
  • список тегов
  1. Ссылка 1 ко многим на таблицу с контентом файла с полями
  • Первичный ключ
  • Идентификатор файла
  • порядковый номер куска/chunk'а
  • BLOB поле

Обращаю внимание, что поле BLOB является стандартным типом поддерживаемым практически любой SQL СУБД.

Работает это так:

  1. Берем файл
  2. Определяем его метаданные и пишем в заголовочную таблицу
  3. Открываем файл делим его на куски и куски пишем в список BLOB полей

P.S. Для любителей говорить о том, что типа страдает скорость приведу маленькую справочку - файл в файловой системе любой ОС организован как БД. То есть заголовочек и есть списочек контента файла на которые хранятся ссылки

→ Ссылка