Каков наилучший способ хранения медиа-файлов в базе данных?

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

Я также подумал о возможности иметь "ссылки" на эти файлы, но, возможно, это принесет больше проблем, чем решений. Любой опыт в этом направлении будет приветствоваться:)

Примечание: база данных будет MySQL.

10 ответов

Решение

Каждая система, о которой я знаю, хранит большое количество больших файлов, хранит их внешне в базе данных. Вы сохраняете в базе данных все запрашиваемые данные для файла (название, исполнитель, длина и т. Д.), А также частичный путь к файлу. Когда пришло время извлечь файл, вы извлекаете путь к файлу, добавляете к нему некоторый корневой каталог (или URL) и возвращаете его.

Таким образом, у вас будет столбец "location" с частичным путем в нем, например "a/b/c/1000", который вы затем сопоставите: " http://myserver/files/a/b/c/1000.mp3"

Убедитесь, что у вас есть простой способ указать базу данных мультимедиа на другой сервер / каталог, если вам это нужно для восстановления данных. Также вам может понадобиться подпрограмма, которая повторно синхронизирует базу данных с содержимым файлового архива.

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

Я думаю, что хранить их в базе данных - это нормально, если вы используете хорошую реализацию. Вы можете прочитать эту старую, но хорошую статью, в которой вы найдете идеи о том, как защитить большие объемы данных в базе данных от снижения производительности.

http://www.dreamwerx.net/phpforum/?id=1

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

Дополнительные преимущества БД (еще не упомянуты): - Лучше работает в среде с балансировкой нагрузки - Вы можете повысить масштабируемость хранилища на сервере

Преимущества использования базы данных:

  • Легко объединить звуковые файлы с другими битами данных.
  • Избегайте операций ввода-вывода файлов, которые обходят безопасность базы данных.
  • Нет необходимости в операциях разделения для удаления звуковых файлов при удалении записей базы данных.

Недостатки использования базы данных:

  • Раздувание базы данных
  • Базы данных могут быть дороже, чем файловые системы

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

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

Например, если вы храните XYZ.Wav в C:\MyProgram\Data\Sounds\X\, полный путь будет

C:\MyProgram\Data\Sounds\X\XYZ.Wav

Но вы бы сохранили путь и / или имя файла в базе данных как:

X\XYZ.Wav

В другом месте, в базе данных или в файлах конфигурации вашей программы, сохраните корневой путь, такой как SoundFilePath, равный

C: \ MyProgram \ Data \ Sounds \

Конечно, где вы отделите корень от пути к базе данных, зависит только от вас. Таким образом, если вы перемещаете установку программы, вам не нужно обновлять базу данных.

Кроме того, если будет много файлов, найдите способ хэширования путей, чтобы не создавать один каталог, содержащий сотни или тысячи файлов (в моем небольшом примере есть подкаталоги, основанные на первом символе имя файла, но вы можете пойти глубже или использовать случайные хэши). Это также радует поисковые индексы.

Некоторые преимущества использования BLOB-объектов для хранения файлов

  • Снижение затрат на управление - используйте один инструмент для резервного копирования / восстановления и т. Д.
  • Нет возможности для синхронизации базы данных и файловой системы
  • Транзакционные возможности (при необходимости)

Некоторые недостатки

  • взрывает оперативную память серверов баз данных ненужным мусором, который может использоваться для хранения строк, индексов и т. д.
  • Делает ваши резервные копии БД очень большими, следовательно, менее управляемыми
  • Не так удобно, как файловая система для обслуживания клиентов (например, с веб-сервером)

Как насчет производительности? Ваш пробег может отличаться. Файловые системы чрезвычайно разнообразны, так же как и базы данных по своей производительности. В некоторых случаях файловая система победит (возможно, с меньшим количеством больших файлов). В некоторых случаях БД может быть лучше (может быть, с очень большим количеством небольших файлов).

В любом случае, не волнуйтесь, делайте то, что кажется лучшим в то время.

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

Вы можете сохранить их как BLOB (или LONGBLOB), а затем извлечь данные, когда вы захотите получить доступ к медиафайлам.

или же

Вы можете просто сохранить медиа-файлы на диске и сохранить метаданные в БД.

Я склоняюсь к последнему методу. Я не знаю, как это делается в целом в мире, но я подозреваю, что многие другие будут делать то же самое.

Вы можете хранить ссылки (частичные пути к данным) и затем извлекать эту информацию. Облегчает перемещение объектов на дисках и доступ к ним.

Я сохраняю относительный путь каждого файла в БД вместе с другими метаданными о файлах. Базовый путь может быть изменен на лету, если мне нужно переместить фактические данные на другой диск (локальный или через UNC-путь).

Вот как я это делаю. Я уверен, что у других тоже будут идеи.

Храните их как внешние файлы. Затем сохраните путь в поле varchar. Помещение больших двоичных двоичных объектов в реляционную базу данных, как правило, очень неэффективно - они занимают только место и замедляют работу, так как кеши заполняются, что невозможно. И нечего приобретать - сами капли не могут быть найдены. Возможно, вы захотите сохранить метаданные мультимедиа в базу данных.

Простым решением было бы просто сохранить относительные местоположения файлов в виде строк и позволить файловой системе справиться с этим. Я попробовал это на проекте (мы хранили офисные файлы к опросу), и он работал нормально.

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

https://min.io/

для облака: AWS S3

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

Для структурированных данных обычно используется ACID, и если это также требование для двоичных файлов, то альтернативы их хранению в базе данных нет.

Еще одним требованием, которое может существовать, является горизонтальная масштабируемость. Если нам это нужно и мы можем отказаться от ACID, то такое решение, как S3 или min.io, может сработать.

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

Другие вопросы по тегам