¿Cuál es la mejor manera de almacenar archivos multimedia en una base de datos?

Quiero almacenar una gran cantidad de archivos de sonido en una base de datos, pero no sé si es una buena práctica. Me gustaría saber los pros y los contras de hacerlo de esta manera.

También pensé en la posibilidad de tener “enlaces” a esos archivos, pero tal vez esto conlleve más problemas que soluciones. Cualquier experiencia en esta dirección será bienvenida 🙂

Nota: la base de datos será MySQL.

Cada sistema que conozco que almacena grandes cantidades de archivos grandes los almacena externamente en la base de datos. Almacena todos los datos consultables para el archivo (título, artista, longitud, etc.) en la base de datos, junto con una ruta parcial al archivo. Cuando llega el momento de recuperar el archivo, extrae la ruta del archivo, antepone alguna raíz de archivo (o URL) y lo devuelve.

Por lo tanto, tendrías una columna de “ubicación”, con una ruta parcial, como “a / b / c / 1000″, que luego asignarás a: ” http: // myserver / files / a / b / c /1000.mp3 ”

Asegúrese de tener una manera fácil de señalar la base de datos multimedia en un servidor / directorio diferente, en caso de que lo necesite para la recuperación de datos. Además, es posible que necesite una rutina que vuelva a sincronizar la base de datos con el contenido del archivo comprimido.

Además, si va a tener miles de archivos multimedia, no los almacene en un solo directorio gigante, es un cuello de botella de rendimiento en algunos sistemas de archivos. En cambio, divídalos en múltiples subárboles equilibrados.

Creo que almacenarlos en la base de datos está bien, siempre que uses una buena implementación. Puede leer este artículo anterior pero bueno para obtener ideas sobre cómo evitar que la mayor cantidad de datos en la base de datos afecte el rendimiento.

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

He tenido literalmente cientos de gigs cargados en las bases de datos mysql sin ningún problema. El diseño y la implementación son clave, hazlo mal y sufrirás.

Más ventajas de DB (no mencionadas anteriormente): – Funciona mejor en un entorno con equilibrio de carga – Puede crear más escalabilidad de almacenamiento de backend

He experimentado en diferentes proyectos haciendo ambas cosas y finalmente hemos decidido que también es más fácil usar el sistema de archivos. Después de todo, el sistema de archivos ya está optimizado para almacenar, recuperar e indexar archivos.

El único consejo que tengo sobre eso es solo almacenar una ruta de “raíz relativa” al archivo en la base de datos, luego haga que su progtwig o sus consultas / procedimientos almacenados / middleware utilicen un parámetro raíz específico de la instalación para recuperar el archivo .

Por ejemplo, si almacena XYZ.Wav en C: \ MyProgram \ Data \ Sounds \ X \, la ruta completa sería

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

Pero almacenaría la ruta o el nombre de archivo en la base de datos como:

 X\XYZ.Wav 

En otro lugar, en la base de datos o en los archivos de configuración de su progtwig, almacene una ruta raíz como SoundFilePath igual a

C: \ MyProgram \ Data \ Sounds \

Por supuesto, donde se divide la raíz de la ruta de la base de datos depende de usted. De esta forma, si mueve la instalación de su progtwig, no tiene que actualizar la base de datos.

Además, si va a haber muchos archivos, encuentre alguna forma de calcular los caminos para que no terminen con un directorio que contenga cientos o miles de archivos (en mi pequeño ejemplo, hay subdirectorios basados ​​en el primer carácter de el nombre del archivo, pero puede profundizar o usar hashes aleatorios). Esto hace felices a los indexadores de búsqueda también.

Ventajas de usar una base de datos:

  • Fácil de unir archivos de sonido con otros bits de datos.
  • Evitar operaciones de E / S de archivos que omiten la seguridad de la base de datos.
  • No es necesario realizar operaciones de separación para eliminar archivos de sonido cuando se eliminan los registros de la base de datos.

Desventajas de usar una base de datos:

  • Inflamación de la base
  • Las bases de datos pueden ser más caras que los sistemas de archivos

Puede almacenarlos como BLOB (o LONGBLOB) y luego recuperar los datos cuando realmente quiere acceder a los archivos multimedia.

o

Simplemente podría almacenar los archivos multimedia en una unidad y almacenar los metadatos en la base de datos.

Me inclino por el último método. No sé cómo se hace esto en general en el mundo, pero sospecho que muchos otros harían lo mismo.

Puede almacenar enlaces (rutas parciales a los datos) y luego recuperar esta información. Facilita el movimiento de las unidades y sigue accediendo a ellas.

Guardo la ruta relativa de cada archivo en el DB junto con otros metadatos sobre los archivos. La ruta base puede cambiarse sobre la marcha si tengo que reubicar los datos reales en otra unidad (ya sea local o a través de la ruta UNC).

Así es como lo hago. Estoy seguro de que los demás también tendrán ideas.

Algunas ventajas de usar blobs para almacenar archivos

  • Menor sobrecarga de administración: use una sola herramienta para realizar copias de seguridad / restaurar, etc.
  • No hay posibilidad de que la base de datos y el sistema de archivos no estén sincronizados
  • Capacidad transaccional (si es necesario)

Algunas desventajas

  • explota la RAM de los servidores de la base de datos con basura inútil que podría usarse para almacenar filas, índices, etc.
  • Hace que sus copias de seguridad de bases de datos sean muy grandes, por lo tanto, menos manejables
  • No es tan conveniente como un sistema de archivos para servir a los clientes (por ejemplo, con un servidor web)

¿Qué hay del rendimiento? Su experiencia puede ser diferente. Los sistemas de archivos son extremadamente variados, también lo son las bases de datos en su desempeño. En algunos casos, un sistema de archivos ganará (probablemente con menos archivos más grandes). En algunos casos, una base de datos podría ser mejor (tal vez con una gran cantidad de archivos pequeños).

En cualquier caso, no te preocupes, haz lo que parezca mejor en ese momento.

Algunas bases de datos ofrecen un servidor web incorporado para servir blobs. En el momento de escribir, MySQL no.

Guárdelos como archivos externos. A continuación, guarde la ruta en un campo varchar. En general, poner blobs binarios grandes en una base de datos relacional es muy ineficiente: solo agotan el espacio y ralentizan las cosas a medida que se agotan las memorias caché. Y no hay nada que ganar, los blobs mismos no se pueden buscar. Sin embargo, es posible que desee guardar metadatos de medios en la base de datos.

Una solución simple sería simplemente almacenar las ubicaciones relativas de los archivos como cadenas y dejar que el sistema de archivos lo maneje. Lo probé en un proyecto (estábamos almacenando archivos adjuntos de la oficina en una encuesta), y funcionó bien.