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


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

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

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

8 53

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

X\XYZ.Wav

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

C:\MyProgram\Data\Sounds\

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

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

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

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

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

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

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

или

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

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

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

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

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

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

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

недостатки

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

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

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

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

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

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