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






Простым решением было бы просто сохранить относительное расположение файлов в виде строк и позволить файловой системе обрабатывать это. Я пробовал его в проекте (мы хранили офисные файлы, прикрепленные к опросу), и он работал нормально.
Вы можете сохранить их как BLOB-объекты (или LONGBLOB-объекты), а затем извлекать данные, когда вы действительно хотите получить доступ к медиафайлам.
или же
Вы можете просто хранить медиафайлы на диске и хранить метаданные в БД.
Я склоняюсь к последнему методу. Я не знаю, как это делается в целом в мире, но подозреваю, что многие другие поступили бы так же.
Вы можете сохранять ссылки (частичные пути к данным), а затем получать эту информацию. Позволяет легко перемещать вещи на дисках и по-прежнему получать к ним доступ.
Я сохраняю относительный путь к каждому файлу в БД вместе с другими метаданными о файлах. Затем базовый путь можно изменить на лету, если мне нужно переместить фактические данные на другой диск (локальный или через UNC-путь).
Вот как я это делаю. Я уверен, что у других тоже будут идеи.
Преимущества использования базы данных:
Недостатки использования базы данных:
Я думаю, что хранить их в базе данных можно, если вы используете хорошую реализацию. Вы можете прочитать эту старую, но хорошую статью, чтобы узнать, как уберечь большие объемы данных в базе данных от снижения производительности.
http://www.dreamwerx.net/phpforum/?id=1
У меня было буквально 100 гигов, загруженных в базы данных mysql без каких-либо проблем. Дизайн и реализация являются ключевыми, сделайте это неправильно, и вы пострадаете.
Дополнительные преимущества БД (еще не упомянутые): - Лучше работает в среде со сбалансированной нагрузкой - Вы можете увеличить масштабируемость внутреннего хранилища
Я думаю использовать это ... Я надеюсь, что эта штука все еще остается хорошей, или есть еще какое-нибудь лучшее решение?
Каждая известная мне система, которая хранит большое количество больших файлов, хранит их вне базы данных. Вы сохраняете все запрашиваемые данные для файла (название, исполнитель, длину и т. д.) В базе данных вместе с частичным путем к файлу. Когда пришло время получить файл, вы извлекаете путь к файлу, добавляете к нему некоторый корень файла (или URL-адрес) и возвращаете его.
Итак, у вас будет столбец «местоположение» с частичным путем в нем, например «a / b / c / 1000», который вы затем сопоставите: «http: //myserver/files/a/b/c/1000.mp3»
Убедитесь, что у вас есть простой способ указать базу данных мультимедиа на другом сервере / каталоге на случай, если это понадобится для восстановления данных. Кроме того, вам может потребоваться процедура, которая повторно синхронизирует базу данных с содержимым файлового архива.
Кроме того, если вы собираетесь иметь тысячи медиафайлов, не храните их все в одном гигантском каталоге - это узкое место производительности в некоторых файловых системах. Вместо этого разбейте их на несколько сбалансированных поддеревьев.
Хороший пост! Я не копировал вас, я набирал свой ответ, пока вы писали :-)
У этой реализации есть проблемы с масштабируемостью, когда вы получаете 2+ веб-сервера.
В нашем случае решением для масштабируемости был выделенный сервер для хранения файлов с запущенной на нем веб-службой для архивирования и поиска. Вы даете ему файл, он сохраняет его и сообщает вам, куда он его поместил. Любое количество внешних серверов приложений может хранить и извлекать файлы с него.
Я действительно не получил комментария о «масштабируемости». Если вы храните медиафайлы в базе данных, у вас все равно будет одно место, куда можно будет получить файл, но это будет операция с более высокими накладными расходами.
Масштабируемость достигается за счет крупномасштабного дизайна. Вы запрашиваете главный кластер. Они знают, где хранятся все файлы и какие серверы хранения доступны. Затем на основе полученных от них данных вы подключаетесь к любому количеству серверов хранения для хранения / восстановления.
Я экспериментировал в разных проектах с обоими способами, и мы наконец решили, что проще использовать файловую систему. В конце концов, файловая система уже оптимизирована для хранения, извлечения и индексации файлов.
Один совет, который я хотел бы сказать по этому поводу, - это хранить только "относительный корневой" путь к файлу в базе данных, а затем пусть ваша программа или ваши запросы / хранимые процедуры / промежуточное ПО будут использовать специальный корневой параметр установки для извлечения файла. .
Например, если вы храните 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 к OutofMemoryError ?? Я имел дело с несколькими файлами в своем приложении и хранил файлы в виде закодированных строк в базе данных sqllite Android, что приводит к OutofMemoryError, когда общий размер файла достигает 20 МБ, который может включать сотни файлов. Приводит ли использование blob к той же проблеме? ?
Храните их как внешние файлы. Затем сохраните путь в поле varchar. Помещение больших двоичных объектов в реляционную базу данных обычно очень неэффективно - они только занимают место и замедляют работу, поскольку кеши заполнены и непригодны для использования. И тут ничего не добьешься - сами кляксы поискать нельзя. Однако вы можете захотеть сохранить метаданные мультимедиа в базе данных.
Лучший способ хранить аудио / видео файлы, вы можете использовать любое распределенное хранилище, которое может быть локальным или облачным.
для облака: AWS S3
Как относились к именованию файлов?