2011-03-12 29 views
17

Estoy codificando una aplicación que cargará y eliminará muchos archivos, por lo general solo muevo los archivos a una carpeta en el servidor dándoles los nombres con la fila única id. Pero como yo entiendo, MySQL también me permite almacenar datos binarios (archivos) ¿cuándo sería esta una mejor opción?¿Cuándo se recomienda utilizar MySQL BLOB?

Utilice argumentos sólidos, como cuando ¿El uso de BLOB significará el rendimiento mejora ?.

P.S: Estoy usando MyISAM si eso es importante.

Gracias.


ACTUALIZACIÓN:

preguntas relacionadas:
- Storing Images in DB - Yea or Nay?
- To Do or Not to Do: Store Images in a Database (gracias a Sebastián)

ACTUALIZACIÓN 2

Almacenamiento de los archivos de la base de datos es no es una necesidad que estoy tratando de saber cuándo es esta una idea mejor que el almacenamiento de en carpetas.

Respuesta

12

Leer:

cuales concluye

Si en alguna ocasión necesita para recuperar una imagen y tiene que estar disponible en varios servidores web diferentes. Pero yo creo que es más o menos eso.

  • Si no tiene que estar disponible en varios servidores, siempre es mejor los pusieron en el sistema de archivos.
  • Si tiene a estar disponible en varios servidores y De hecho, hay algún tipo de carga en el sistema , que necesitará algún tipo de almacenamiento distribuido.
+1

Incluso en ese caso, creo que memcached podría ser una mejor forma de "distribuir" el archivo de imagen: usted mantiene la imagen en una ubicación/servidor y la almacena en Memcache luego de un golpe y la utiliza en múltiples servidores/solicitudes web. – Suman

9

Si está utilizando el motor db MyISAM, los campos BLOB se pueden indexar para que pueda realizar búsquedas rápidas en sus archivos utilizando la base de datos.

También otra ventaja de almacenar archivos en los campos BLOB es que se puede acceder a ellos de manera más eficiente que los archivos en el disco (no hay necesidad de recorrer el directorio, abrir, leer, cerrar).

Si planea almacenar muchos archivos en MYSQL, generalmente es una buena práctica tener los archivos almacenados en una tabla separada. Esto le permite escanear la información meta sin tropezar con los blobs. Luego, cuando realmente necesite buscar un blob, JOIN es adecuadamente eficiente.

+0

Entonces, ¿cuál es mejor en qué situaciones? – amosrivera

+0

Puedes decir qué método es mejor cuando conoces las necesidades de tu aplicación, pero como estás utilizando las tablas MyISAM, entonces almacenar tus archivos en la base de datos puede darte más flexibilidad. – Roman

2

Bueno, es un poco viejo, pero este artículo hace algunos argumentos dignos para el almacenamiento BLOB: http://www.dreamwerx.net/site/article01.

Si bien no es una ganancia de rendimiento per se, tener sus imágenes y otras cosas en un DB en lugar de en un directorio también debería eliminar los problemas con hotlinking (suponiendo que esta sea una aplicación web públicamente disponible).

0

¿Está obligado a usar MySQL? De lo contrario, pruebe con un ODBMS o PostgreSQL para almacenar archivos, o podría almacenar solo las rutas para los archivos. Ver this por ejemplo.

+0

Almacenar los archivos en la base de datos no es una necesidad, solo estoy tratando de saber cuándo es esta una mejor solución – amosrivera

0

Memcache no es una solución alternativa ya que necesita administrar redundancia y TTL en servidores distribuidos que dificultan el mantenimiento.

La mejor solución en mi opinión es poner datos públicos estáticos en CDN que se distribuyen por diseño y datos estáticos privados en la base de datos para facilitar la distribución en múltiples servidores.

Cada servidor puede implementar su propio Memcache en cada golpe.

Si ya almacenan los datos en el sistema de archivos y desea migrar en la base de datos, la manera más fácil es crear una clave, la tabla de valores de los siguientes:

CLAVE = '/ imagen/nombre de archivo' (cadena de la ubicación del sistema de archivos), value = BLOB (el archivo real) y crear un contenedor que lo obtendrá de la base de datos con la ayuda de la regla de reescritura y el manejo de la aplicación. De esta forma puede usar transparencia total con su código existente.