2008-09-30 34 views
47

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.¿Cuál es la mejor manera de almacenar archivos multimedia en una base de datos?

También pensé en la posibilidad de tener "enlaces" a esos archivos, pero quizás esto conlleve más problemas que soluciones. Cualquier experiencia en esta dirección será bienvenida :)

Nota: La base de datos será MySQL.

Respuesta

78

Cada sistema que conozco que almacena grandes cantidades de archivos grandes almacena externamente a 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ía una columna de "localización", con una ruta parcial en ella, como "a/b/c/1000", que luego se asigna a: "http://myserver/files/a/b/c/1000.mp3"

Asegúrese que tiene una manera fácil de señalar la base de datos de medios 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 directorio gigante, es un cuello de botella de rendimiento en algunos sistemas de archivos. En cambio, divídalos en múltiples subárboles equilibrados.

+0

¡Buena publicación! No te estaba copiando, estaba escribiendo mi respuesta mientras publicabas :-) – CMPalmer

+1

Esta implementación tiene problemas de escalabilidad, cuando obtienes más de 2 servidores web. – DreamWerx

+0

La solución de escalabilidad en nuestro caso era un servidor dedicado para almacenar los archivos con un servicio web ejecutándose para su archivo y recuperación. Le das un archivo, lo almacena y te dice dónde lo puso. Cualquier número de servidores de aplicaciones front-end puede almacenar y recuperar archivos de él. – CMPalmer

1

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.

+0

¿Cómo trataste con el nombre del archivo? –

3

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

o

Usted puede simplemente almacenar los archivos multimedia en una unidad y almacenar los metadatos en la base de datos.

Me inclino por este ú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.

7

Las ventajas de utilizar una base de datos:

  • fácil unirse a los archivos de sonido con otros bits de datos .
  • Evitando las operaciones de E/S de archivo que omiten la seguridad de la base de datos.
  • No es necesario realizar operaciones de separación en para eliminar archivos de sonido cuando se eliminan los registros de la base de datos .

desventajas de usar una base de datos:

  • Base de Datos de la hinchazón
  • bases de datos pueden ser más caros que los sistemas de archivos
15

las pienso almacenar en la base de datos es aceptable, siempre y cuando Usas 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

que he tenido, literalmente, 100 de los conciertos 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 DB (no ya mencionados): - funciona mejor en una carga ambiente equilibrado - Se puede construir en la escalabilidad de almacenamiento más backend

+0

Estoy pensando en usar esto ... Espero que esto siga siendo bueno, ¿o hay alguna otra solución mejor disponible? – Manu

8

He experimentado en diferentes proyectos haciéndolo en ambos sentidos y finalmente hemos decidido que es más fácil usar el sistema de archivos también. 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 almacenar solo una ruta "raíz relativa" al archivo en la base de datos, luego haga que su programa 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: \ MiPrograma \ Data \ Sounds \ X \ la ruta completa sería

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

pero sería almacenar la ruta y nombre de archivo o en la base de datos como :

X\XYZ.Wav 

otra parte, en la base de datos o en los archivos de configuración de sus programas, almacenar una ruta de raíz como SoundFilePath igual a

C: \ MiPrograma \ Data \ Sounds \

Por supuesto, donde usted 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 programa, no tiene que actualizar la base de datos.

Además, si no van a ser un montón de archivos, encontrar alguna forma de hash de los caminos para que no terminará con un directorio que contiene cientos o miles de archivos (en mi ejemplo, hay subdirectorios basado en el primer caracter del nombre de archivo, pero puedes profundizar o usar hashes aleatorios). Esto hace felices a los indexadores de búsqueda también.

3

Algunas ventajas de usar las gotas para almacenar archivos

  • Bajos gastos de gestión - utilizar una única herramienta de copia de seguridad/restauración, etc.
  • Sin posibilidad de base de datos y sistema de archivos para estar fuera de sincronía
  • capacidad transaccional (si es necesario)

Algunas desventajas

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

¿Qué pasa con el 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 se preocupe, haga 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.

+0

¿Almacenar archivos como blob dará lugar a OutofMemoryError? Estaba lidiando con una cantidad de archivos en mi aplicación y almacenando archivos como cadenas codificadas en la base de datos sqllite de android y que conduce a OutofMemoryError cuando el tamaño total del archivo alcanza los 20 mb, lo que puede incluir cientos de archivos. ¿Usar blob conduce al mismo problema? ? – KJEjava48

2

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.

Cuestiones relacionadas