¿Almacenar imágenes como archivos o en la base de datos para una aplicación web?

124

Mi pregunta es bastante genérica y sé que podría no haber una respuesta al 100%. Estoy creando una solución web ASP .NET que incluirá muchas imágenes y, con suerte, una buena cantidad de tráfico. Tengo muchas ganas de lograr el rendimiento.

¿Debo guardar las imágenes en la base de datos o en el sistema de archivos? Y sin importar la respuesta, estoy más interesado en por qué elegir una forma específica.

Muchas gracias Stefan

DUPLICAR : Almacenar imágenes en DB - ¿Sí o no? , ¿Cómo almacenar imágenes en su sistema de archivos , almacenando una pequeña cantidad de imágenes: blob o fs? y probablemente algunos otros.


COMENTARIO: Gracias por muchas buenas respuestas. Iré por una solución basada en archivos, incluso si me gusta la idea de tener una solución 100% basada en bases de datos. Parece que hoy existen buenas soluciones para hacer lo que quiero con las bases de datos, etc., pero tengo algunas razones para no hacerlo.

  • Estaré en una solución alojada, tengo una gran cantidad de almacenamiento (10 gb) pero solo 300mb para la base de datos. Costará mucho almacenamiento adicional en la base de datos.

  • No soy un experto en DB y tampoco controlo la configuración de la DB. Una solución basada en DB puede necesitar una configuración personalizada como parece.

Si nos movemos para ejecutar el sitio en nuestro propio servidor, podría considerar una solución basada en DB. gracias Stefan

StefanE
fuente
1
Por favor, especifique la base de datos que está utilizando.
Gerrie Schenck
1
Tengo la intención de usar MSSQL de la versión posterior.
StefanE
1
@StefanE, El sistema de archivos es, a todos los efectos, una base de datos especializada optimizada para el almacenamiento de archivos.
LukeH

Respuestas:

175

Almacene las imágenes en el sistema de archivos y las ubicaciones de las imágenes en la base de datos.

¿Por qué? Porque...

  1. Podrá servir las imágenes como archivos estáticos.
  2. No se requerirá acceso a la base de datos o código de aplicación para obtener las imágenes.
  3. Las imágenes pueden ser servidas desde un servidor diferente para mejorar el rendimiento.
  4. Reducirá el cuello de botella de la base de datos.
  5. La base de datos finalmente almacena sus datos en el sistema de archivos.
  6. Las imágenes se pueden almacenar en caché fácilmente cuando se almacenan en el sistema de archivos.
Akbar ibrahim
fuente
1
Además, en SQL Server cuando almacena la imagen como un campo "Imagen", esto es efectivamente lo que está haciendo SQL: almacenar un puntero al archivo en el disco en algún lugar. Así es como se supera el límite de página de 8 KB.
Zhaph - Ben Duguid
9
Esto realmente se ha abordado en SQL Server 2008. Se introdujo un nuevo tipo de FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx que permite aprovechar el "rendimiento del sistema de archivos y al mismo tiempo mantener consistencia transaccional entre los datos no estructurados y los datos estructurados correspondientes "
kristof
Sí, tienes razón. mi pregunta es ¿cuál es el tamaño de la gota? o cuánta memoria puede almacenar?
Ameer
11

En mis proyectos desarrollados recientemente, almacené imágenes (y todo tipo de documentos binarios) como columnas de imágenes en tablas de bases de datos.

La ventaja de tener archivos almacenados en la base de datos es obviamente que no termina con archivos sin referencia en el disco duro si se elimina un registro, ya que la sincronización entre la base de datos (= metadatos) y el disco duro (= almacenamiento de archivos) no está integrada y tiene que ser programado manualmente.

Utilizando la tecnología actual, le sugiero que almacene imágenes en columnas FILESTREAM de SQL Server 2008 (al menos eso es lo que voy a hacer con mi próximo proyecto), ya que combinan la ventaja de almacenar datos en la base de datos Y tener grandes binarios en archivos separados (en menos según publicidad;))

devio
fuente
¿Ya ha probado la funcionalidad de Filestream?
StefanE
1
En realidad, al eliminar el registro DB, también se puede codificar para eliminar del sistema de archivos. Así que me parece bien almacenar en FS en lugar de DB
kailash19
9

El dicho siempre ha sido "Archivos en el sistema de archivos, metadatos de archivos en la base de datos"

Matt Darby
fuente
6

Es mejor almacenar archivos como archivos. Diferentes bases de datos manejan los datos de Blob de manera diferente, por lo que si tiene que migrar su back-end podría tener problemas.

Cuando se sirven los impages, es probable que un <img src = a un archivo que ya existe en el servidor sea más rápido que crear un archivo temporal desde el campo de la base de datos y señalar la etiqueta <img a eso.

Encontré esta respuesta buscando en Google su pregunta y leyendo los comentarios en http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html

bigotes
fuente
1
la publicación referida parece un poco desactualizada.
devio
6

Por lo general, me gusta tener archivos binarios en la base de datos porque:

  • integridad de datos: sin archivo sin referencia, sin ruta en la base de datos sin ningún archivo asociado
  • consistencia de datos: tome un volcado de la base de datos y eso es todo. no "O olvidé targz este directorio de datos".
chburd
fuente
4

El almacenamiento de imágenes en la base de datos agrega una sobrecarga de la base de datos para servir imágenes individuales y dificulta la descarga al almacenamiento alternativo (S3, Akami) si creces a ese nivel. Almacenarlos en la base de datos hace que sea mucho más fácil mover su aplicación a un servidor diferente, ya que solo la base de datos necesita moverse ahora.

El almacenamiento de imágenes en el disco facilita la descarga al almacenamiento alternativo, hace que las imágenes sean elementos estáticos para que no tenga que meterse con los encabezados HTTP en su aplicación web para que las imágenes se puedan almacenar en caché. La desventaja es que si alguna vez mueves tu aplicación a un servidor diferente, también debes recordar mover las imágenes; algo que se olvida fácilmente

Adam Hawes
fuente
3

Para aplicaciones basadas en la web, obtendrá un mejor rendimiento al usar el sistema de archivos para almacenar sus imágenes. Hacerlo le permitirá implementar fácilmente el almacenamiento en caché de las imágenes en múltiples niveles dentro de su aplicación. Existen algunas ventajas para almacenar imágenes en una base de datos, pero la mayoría de las veces esas ventajas vienen con aplicaciones basadas en el cliente.

Dillie-O
fuente
0

Solo para agregar un poco más a las respuestas ya buenas hasta ahora. Usted todavía puede obtener los beneficios del almacenamiento en caché tanto del nivel de web tal y el nivel de base de datos si vas a la ruta que mantener las imágenes en la base de datos.

Creo que para la base de datos puede lograr esto mediante la forma en que almacena las imágenes en relación con los datos textuales asociados con ellas y si puede acceder a las imágenes en una consulta particular para que la base de datos pueda almacenar en caché la consulta (aunque la teoría es así siéntete libre de bombardearme en esa parte).

Con el lado web, supongo que dado que su pregunta está etiquetada con asp.net, usaría un controlador http para mostrar las imágenes. Luego, tiene todos los beneficios del marco a su disposición y puede mantener su lógica de dominio más limpia con solo tener que pasar la clave de su imagen al controlador http.

MotoWilliams
fuente
-1

¿Por qué no elegir una base de datos NoSql individual para almacenar sus archivos?

Le brinda integridad de datos, consistencia de datos como @chburd mencionó.

Mientras usted rdbms todavía se mantiene pequeño.

Will Wu
fuente
-1
  1. Aquí hay un ejemplo paso a paso (enfoque general, implementación de Spring Eclipse) de almacenar imágenes en el sistema de archivos y mantener sus metadatos en DB - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Aquí también hay un ejemplo: http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. También puede investigar una base de código de este proyecto: https://github.com/jdmr/fileUpload . Presta atención a este controlador.
Lord Nighton
fuente