Как лучше всего хранить медиафайлы в базе данных?

StackOverflow https://stackoverflow.com/questions/154707

Вопрос

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

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

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

Это было полезно?

Решение

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

Итак, у вас будет столбец «Местоположение» с частичным путем, например «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-объекты (или LONGBLOB-объекты), а затем извлекать данные, когда вам действительно понадобится доступ к медиа-файлам.

или

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

https://min.io/

для облака:АВС С3

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top