2010-07-21 11 views
16

Estoy construyendo una aplicación asp.net mvc donde los usuarios pueden adjuntar una imagen a su perfil, pero también en otras áreas del sistema como un gadget de mensajes en el tablero que muestra mensajes recientes, etc.¿Almacenar imágenes de perfil de usuario en el disco o en la base de datos?

Cuando el usuario carga estos Me pregunto si sería mejor almacenarlos en la base de datos o en el disco.

ventajas Databse

  • fácil de base de datos completa de copia de seguridad y mantener el contenido de perfil/imágenes con mesas de perfil/usuario asociados

  • cuando construyo servicios web más adelante por la pista, que sólo puede extraiga todos los datos relacionados profiles de un solo lugar (la base de datos)

Sistema de Archivos ventajas

  • la carga de archivos desde el disco es probablemente más rápido

  • alguna otra ventaja?

Donde otros sitios almacenan este tipo de información. ¿Tengo razón en estar un poco preocupado por el rendimiento de la base de datos por algo como esto?

¿Tal vez habría una manera de almacenar en caché las imágenes extraídas de la base de datos durante un período de tiempo?

Como alternativa, ¿qué ocurre con la idea de almacenar estas imágenes en la base de datos, pero copiarlas en el disco para que el servidor web pueda cargarlas desde allí? Esto parecería dar tanto la copia de seguridad como la conveniencia de un Db, al tiempo que proporciona las ventajas de velocidad de los archivos en el disco.

infraestructura en cuestión

  • La página web será desplegado para IIS en Windows 2003 Server que ejecuta el sistema de archivos NTFS.
  • La base de datos será de SQL Server 2008

Resumen

lectura en torno a una gran cantidad de temas relacionados aquí en SO, muchas personas están en tendencia hacia el tipo de SQL Server Filestream. Sin embargo, por lo que pude deducir (puedo estar equivocado), no hay mucho beneficio cuando los archivos son bastante pequeños. Sin embargo, la distribución de archivos parece mejorar enormemente el rendimiento cuando los archivos tienen múltiples MB o más.

Como mis fotos de perfil tienden a estar alrededor de ~ 5kb, decidí dejarlas almacenadas en un almacén de archivos en la base de datos como varbinary (max).

En ASP.NET MVC vi un problema de rendimiento al devolver FileContentResults por imágenes extraídas de la base de datos de esta manera. Así que terminé el almacenamiento en caché del archivo en el disco cuando se lee si la ubicación de este archivo no se encuentra en la caché de mi aplicación.

Así que supongo que opté por un híbrido;

  • de almacenamiento de base de datos para la cocción de los datos más fáciles y los archivos están vinculados directamente a los perfiles
  • Sombra copia en el disco para permitir un mejor almacenamiento en caché

En cualquier momento puedo eliminar la carpeta de caché en el disco , y a medida que se vuelven a solicitar las imágenes, se volverán a copiar en el primer golpe y se servirán desde el caché que se encuentra allí después.

+3

Debe leer esto: http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – Anders

+0

Lo siento, hay algunos errores tipográficos con mi pregunta. Escribiendo esto desde mi iPhone. Editaré cuando llegue a una pc. –

+0

Gracias anders, eso era exactamente lo que estaba buscando. Muchas vistas y opiniones en ese hilo que vinculó. –

Respuesta

4

En realidad, la base de datos de su almacén de datos puede ser más rápida dependiendo de la cantidad de imágenes que tenga, a menos que esté utilizando un motor de sistema de archivos altamente optimizado. Las bases de datos están diseñadas para búsquedas rápidas y utilizan MUCHAS técnicas más interesantes que las que ofrece un sistema de archivos.

reiserfs (obsoleto) realmente increíble para búsquedas, zfs, xfs y NTFS todos tienen fantásticos algoritmos de hash, linux ext4 también parece prometedor.

El golpe en el sistema no va a ser diferente en términos de lecturas de bloque. La pregunta es: ¿qué es más rápido una consulta de búsqueda que devuelve el nombre del archivo (puede ser un hash?) Que a su vez se accede usando un abrir por separado, el cierre del archivo final. o simplemente tirando el blob?

Hay varias cosas a considerar, como el golpe de red, el golpe de procesamiento, la distribuibilidad, etc. Si almacena cosas en la base de datos, puede moverlas. Por otra parte, si almacena imágenes en un servicio de entrega de contenido que puede ser mucho más rápido, ya que no está haciendo ningún éxito en la red.

pensar en ello, y recuerda poco de la evaluación comparativa no hace daño a nadie :-) así que probarlo con su tamaño típico conjunto de datos y tener en cuenta cosas como consultas simultáneas etc.

+0

Hola Rey Elfo. Haces un buen punto sobre la infraestructura, he actualizado mi pregunta. Aunque me doy cuenta de que hay muchos factores a considerar (como ha señalado), estoy buscando opiniones informadas/posiblemente alguna experiencia sobre personas que lo han intentado de una forma u otra y cómo funcionó. –

+0

Bueno, he hecho con éxito ambos en entornos de producción para proyectos grandes. En un proyecto, el sistema produjo aproximadamente 10 x 10MB de imágenes cada segundo de cada día, y todas tuvieron que ser ordenadas y asociadas a múltiples usuarios. (Usó una combinación de FS y DB allí). Aquí debido a la alta tasa de producción tuvo que usar FS distribuidos. En otras, las imágenes eran grandes pero estáticas, usaban manchas DB allí. Creo que para su aplicación, es mejor que solo con DB. Puede que tenga que considerar legalidades de quién posee la imagen digital también. –

4

referencias tienda para los archivos en una base de datos y almacenar los archivos en el disco.

Este enfoque es mucho más flexible y más fácil de escalar.

Puede tener una sola base de datos y varios servidores que sirven contenido estático. Será mucho más complicado tener varias bases de datos haciendo ese trabajo.

Flickr funciona de esta manera.

Espero que ayude.

+1

Impresionante. Estaba tratando de encontrar una buena manera de almacenar la imagen de perfil en mi sitio web, voy a ir con esta solución también –

+0

@JonKoivula Tengo otra respuesta que se adentra en más detalles. Puede ser útil. http://stackoverflow.com/questions/8922056/what-is-the-best-way-to-upload-and-store-pictures-on-the-site/8922090#8922090 – Frankie

+1

Wow muchas gracias Frankie, realmente me dio una respuesta útil. Lo aprecio mucho. –

Cuestiones relacionadas