2008-11-28 7 views
8

Estoy agregando algunas funcionalidades a mi sitio para que los usuarios puedan cargar sus propias imágenes de perfil, así que me preguntaba si almacenarlas en la base de datos como BLOB, o ponerlas en el sistema de archivos.Almacenar una pequeña cantidad de imágenes: blob o fs?

He encontrado una pregunta similar aquí: Storing images in DB: Yea or Nay, pero las respuestas daban más a las personas que esperaban muchos miles o incluso millones de imágenes, mientras que me preocupan más las imágenes pequeñas (JPEG de hasta 150x150 píxeles).), y un pequeño número de ellos: tal vez hasta uno o dos mil.

¿Cuáles son las opiniones acerca de DB BLOB vs Filesystem para este escenario? ¿Cómo van los clientes con el almacenamiento en caché de las imágenes de la base de datos frente al sistema de archivos?

Si los BLOB almacenados en la base de datos son el camino a seguir, ¿hay algo que deba saber sobre donde para almacenarlos? Como imagino que la mayoría de mis usuarios no subirán una imagen, ¿debo crear una tabla user_pics para unirme (externa) a la tabla normal users cuando sea necesario?


Editar: Estoy reapertura de esta pregunta, porque es no un duplicado de los dos se ha vinculado a. Esta pregunta es específicamente sobre los pros/contras de usar un DB o FS para una PEQUEÑA cantidad de imágenes. Como dije antes, la otra pregunta está dirigida a personas que necesitan almacenar miles y miles de imágenes grandes.

Respuesta

7

Para responder a partes de su pregunta:

Como clientes van con imágenes de almacenamiento en caché de la base de datos del sistema de ficheros vs?

Para una base de datos: Tener un campo last_modified en su base de datos. Utilice el encabezado HTTP Last-Modified para que el navegador del cliente pueda almacenar en caché correctamente. Asegúrese de enviar las respuestas adecuadas cuando el navegador solicite una imagen "si es más reciente" (no puede recordar cómo se llama, algún encabezado de solicitud HTTP).

Para un sistema de archivos: haga lo mismo, pero con la hora modificada del archivo.

Si los BLOB almacenados en la base de datos son el camino a seguir, ¿hay algo que deba saber sobre dónde almacenarlos? Como imagino que la mayoría de mis usuarios no subirán una imagen, ¿debo crear una tabla user_pics para (externa) unirme a la tabla de usuarios habituales cuando sea necesario?

Colocaría el BLOB y los metadatos relacionados en su propia tabla, con algún tipo de relación entre este y su tabla de usuarios. Al hacer esto, será más fácil optimizar el método de almacenamiento de la tabla para sus datos, hacer las cosas más ordenadas y dejar espacio para la capacidad de expansión (por ejemplo, una tabla general de "archivos").

0

¿Qué sería más conveniente, desde la perspectiva de servirles, escribir el código para servirlos, procedimientos de respaldo, etc.? Desea la respuesta correcta para usted, no la respuesta correcta para otra persona.

+0

me dices. ¿Qué crees que es más conveniente/más confiable/más fácil/lo que sea? – nickf

0

Desde mi punto de vista, todo lo que quede fuera de la base de datos debería permanecer fuera. Puede ser un sistema de archivos o tablas separadas que no se replican ni se respaldan todos los días. Hace que la base de datos sea mucho más liviana, crece más despacio y es más fácil de entender y mantener.

Si está en MSSQL, asegúrese de que las manchas se guarden en archivos de datos separados. No en PRIMARIO como todo lo demás.

+0

Si no las replicas o copias de seguridad todos los días, ¿cómo vas a restaurar? ¿O no te importan tanto estos archivos? –

0

En Windows, ponga todo lo que pueda en la base de datos. El sistema de archivos es algo lento y algunas veces incluso poco confiable.

En Linux, tiene más opciones. Aquí, debería considerar mover archivos grandes a un sistema de archivos y simplemente mantener el nombre en el DB. Si utiliza un sistema de archivos moderno como Ext3 o ReiseFS, incluso puede crear muchos archivos pequeños con un rendimiento bastante bueno.

También debe tener en cuenta cómo puede acceder a los datos. Si tiene todo en la base de datos, tiene una ruta de acceso, no necesita preocuparse por otro conjunto de permisos, pero tiene que lidiar con la complejidad adicional de leer/escribir BLOB. En muchos DB, los BLOB no se pueden buscar.

En el sistema de archivos, puede ejecutar otras herramientas en sus datos que no es posible si los archivos están almacenados en una base de datos.

1

Una vez me enfrenté a una pregunta similar con un pequeño DMS para archivos pdf. El escenario era diferente al suyo: un máximo de puede ser de 100 archivos con tamaños de hasta 10 MB cada uno, no lo que espera para las imágenes de perfil. Pero la respuesta que me dio un amigo también se aplica a su caso:

Utilice cada sistema de almacenamiento para lo que está diseñado.

tienda datos en una base de datos . Almacene archivos en un sistema de archivos .

Esta no es la última respuesta (*), pero es una buena regla para los principiantes.

Nunca escuché que Windows FS sea lento y, a veces, poco confiable, como dice Aaron Digulla en su respuesta. Si hay tales problemas, esto debe tenerse en cuenta. Pero para las imágenes de avatar, no me parece tan importante.

(*) Lo sé, lo sé, 42 ...

0

Me almacenarlos en la base de datos:

  1. de copia de seguridad/restauración es fácil (Si los archivos de copia de seguridad y también la base de datos, recuperación puntual es más complicado)
  2. Las transacciones en el db significan que nunca debe terminar apuntando a un nombre de archivo que no está allí
  3. Menos posibilidades de que alguien descubra una manera furtiva de poner un script en su servidor a través de una imagen poco fiable subir hack

Dado que se trata de un número reducido de imágenes, la facilidad de uso/administración debe tener preferencia sobre los problemas de rendimiento que se debaten en las preguntas vinculadas.

0

Creo que hay una ventaja de gestión que los almacena en la base de datos; se pueden respaldar y restaurar de manera consistente con los otros datos; no se olvidará de eliminar los obsoletos (bueno, es posible, pero es menos probable), y si migra la base de datos a otra máquina, las imágenes van con eso.

Cuestiones relacionadas