2009-10-09 14 views
9

Duplicar posible:
storing uploaded photos and documents - filesystem vs database blob¿Dónde debería guardar fotos? Sistema de archivos o la base de datos?

estoy empezando a desarrollar una aplicación web, el propósito principal de las cuales es para mostrar las fotos. Los usuarios también podrán subir fotos.

La primera pregunta que surgió fue dónde guardar las fotos: en el sistema de archivos o en la base de datos.

Voy a utilizar una caja de Windows para alojar el sitio. La base de datos es MySQL y el código de back-end está en C# utilizando ASP.NET MVC.

+12

que comience la guerra santa .... –

+0

@Locksfree Podría haber miles de imágenes. Podría ser más, dependiendo de si la gente realmente usa el sitio. – AngryHacker

Respuesta

28

Sistema de archivos, por supuesto, a menos que esté apuntando a una historia en thedailywtf. La manera más fácil es tener las fotos organizadas por una propiedad que pueda derivar del archivo en sí, como su hash SHA-1. Luego simplemente almacene el hash en la base de datos, adjuntando la clave principal de la foto y otros atributos (quién la cargó, cargó la fecha, etc.).

También es una buena idea dividir las fotos en el sistema de archivos, para que no termine con millones de archivos en un solo directorio. Por lo tanto, tendrá algo como esto:

storage/00/e4/f56c0de1c61fdb926e79e8a0a65bd12930c9.jpg 
storage/25/9a/ec1c55bfb660548a6770238668c4b117d92f.jpg 
storage/5d/d5/4b01d98f17a9ad9dd1526b49ba39b5aa37a1.jpg 
storage/63/49/6f740b6c284ce6685dc17d473a7360ace249.jpg 
storage/b1/75/066d178188dde110149a8422ab651b0ee615.jpg 
storage/b1/20/a2b7d02b7b0c43530677ab06235382a37e20.jpg 
storage/da/39/a3ee5e6b4b0d3255bfef95601890afd80709.jpg 

Esto también es fácil de transportar si alguna vez pasa a almacenamiento fragmentado.

+1

La idea de hash SHA-1 para crear directorios y nombres de archivos es brillante. Respuesta aceptada – AngryHacker

+2

Pero, ¿qué tal eliminar? Ejemplo: 2 usuarios subieron el mismo archivo. Entonces, solo existirá un archivo porque el hash (ruta) es el mismo. Cuando uno de ellos borre la foto, el segundo usuario también la perderá. ¿Estoy en lo cierto? – binball

+0

@John Millikin, ¿cómo está generando y almacenando el directorio de almacenamiento en la base de datos? –

3

Generalmente, las personas almacenan datos binarios, como imágenes, en el sistema de archivos, no en la base de datos. Ellos hacen referencia a la ruta del sistema de archivos desde la base de datos. La recuperación de BLOB (objetos grandes binarios) de la base de datos es más lenta que lo que permite que el servidor web sirva archivos estáticos del sistema de archivos.

2

Hace la vida tan fácil cuando tienes una base de datos blob. Debería olvidarse de la pesadilla que es la administración del sistema de archivos.

EDITAR

ID
VARBINARY

Por experiencia esta es una manera eficiente de administrar los archivos binarios. Usted tiene una base de datos que solo tiene archivos binarios. ¿Cómo puede ser más difícil hacer una copia de seguridad?

+1

Hasta que necesite hacer una copia de seguridad de su base de datos, y * sorpresa *, tiene miles de gigas de basura binaria mezcladas con los metadatos. –

+1

Sí, ese debería ser el objetivo principal de cualquier arquitectura de software ... Haga que "la vida sea tan fácil" para el desarrollador. Olvídese de las personas de operaciones que tienen que tratar con una base de datos de varios terabytes o del usuario que tiene que esperar a que las imágenes salgan de un servidor que fue creado para almacenar datos, no imágenes. –

+0

Ustedes no han ofrecido una razón válida para no almacenar datos binarios. Este es el mismo viejo mantra que ha sido arrojado por años. – ChaosPandion

3

Me gustaría utilizar algo como Amazon S3.

Pero, si la opción es entre el sistema de archivos y la base de datos, elegiría el sistema de archivos porque es más rápido almacenar imágenes de un sistema de archivos que de una base de datos.

3

La única razón por la que colocaría fotos como BLOB en una base de datos sería si tuviera un clúster de servidores y estuviera usando la replicación de la base de datos para copiar automáticamente las fotos en cada máquina del clúster.

La vida es mucho más simple si solo almacena las fotos como archivos y almacena los nombres de archivo de las fotos en la base de datos. Si necesita crear nombres de archivo únicos para las fotos, puede usar un entero de clave primaria de la base de datos como parte del nombre del archivo. Pero también podría usar un hash de la foto en sí, como lo sugirió John Milliken. Eso es simple, y simple es mejor.

+0

también se puede hacer en el sistema de archivos. No es necesario poner imágenes en la base de datos. –

+1

"también se puede hacer"? Eso es bastante escueto. ¿Estás diciendo que se puede hacer la replicación automática? Supongo que sí; alguien debe haber escrito un sistema de replicación de archivos. Pero si ya tiene configurada la replicación de la base de datos, podría ser más simple simplemente meter las fotos allí, en lugar de configurar y depurar dos sistemas de replicación separados. ¿Estás en desacuerdo? – steveha

3

Algunas personas señalan que es más fácil de administrar si todo está en la base de datos: incluida la realización de copias de seguridad y la preservación de la integridad referencial.

+0

La única razón para considerar almacenarlos en DB, IMO. – peterchen

+0

Diría que es una maldita buena razón para hacerlo. – ChaosPandion

3

Si lo almacena en db, el db crecerá rápidamente y será mucho, mucho más grande. Es un poco más complicado sacar una imagen de db para mostrarla y luego obtenerla de un sistema de archivos. Por otro lado, es mejor que se asegure de que los nombres de los archivos y las rutas no se desincronicen con lo que se almacena en db. En el pasado, elegí almacenar en disco en lugar de db. Me facilitó mover la base de datos a diferentes cuadros. Funcionó bien.

2

Tuvimos una decisión similar a la de un proyecto en el que estoy. Lo más atractivo de interferir cosas (imágenes y otras cosas BLOBy) en la base de datos es que es menos probable que alguien pueda eliminar/alterar algo (ya sea intencionalmente o no). Pero esa no es la elección que hicimos. En cambio, tenemos la información de ruta almacenada en el DB y la usamos para hacer referencia a los datos a través de la ruta UNC. Las rutas de datos se almacenan en dos partes: una parte que hace referencia a la ubicación de los datos relativa a la máquina en la que reside y una parte que señala a qué máquina está ese grupo de datos. Cuando necesitamos mover datos, podemos actualizar la información de ruta apropiada.

Sin duda es rápido obtener los datos sin tener que salir de la base de datos. En última instancia, ese fue un importante factor decisivo.

4

Si está creando un sitio web alrededor de fotos, entonces olvídese de la base de datos. Si se vuelve popular, su base de datos será duramente golpeada y la mayor parte de su tiempo se dedicará a entregar fotos. Además, las bases de datos no se escalan muy bien. Hay muchas más ventajas para mantenerlos en el sistema de archivos. Y puede escalar muy bien, tener servidores de contenido estático, usar servicios para la entrega de contenido.

Además, Amazon S3 u otros proveedores de servicios en la nube tienen sus ventajas. Por ejemplo, S3 + Amazon CloudFront proporcionará un buen rendimiento. CloudFront almacena en caché sus archivos en servidores de todo el mundo para que sean accesibles de manera muy fácil/rápida desde cualquier lugar. PERO si estamos hablando de imágenes y el sitio se vuelve popular, sus facturas pueden ser bastante altas.

Para S3 Amazon charges por almacenamiento y por transferencia dentro/fuera de la nube. para CloudFront per transfer.

4

Si está utilizando SQL Server 2008, hay un tipo de datos Filestream que maneja la mayoría de los problemas mencionados sobre la DB cada vez más grande. Maneja todos los detalles molestos de la sincronización entre el sistema de archivos y la tabla.

ver aquí un post sobre el tema: Store any data in SQL Server 2008 (Katmai)

+0

Por cierto, esta publicación fue meramente informativa ... :) – Siewers

Cuestiones relacionadas