database - for - sql server save file
Almacenamiento de imágenes en DB-Sí o Nay? (30)
Algo que nadie ha mencionado es que el DB garantiza acciones atómicas, integridad transaccional y se ocupa de la concurrencia. Incluso la integridad referencial está fuera de la ventana con un sistema de archivos, así que, ¿cómo sabe que los nombres de sus archivos siguen siendo correctos?
Si tiene sus imágenes en un sistema de archivos y alguien está leyendo el archivo mientras está escribiendo una nueva versión o incluso eliminando el archivo, ¿qué sucede?
Utilizamos blobs porque son más fáciles de administrar (copia de seguridad, replicación, transferencia) también. Funcionan bien para nosotros.
Así que estoy usando una aplicación que almacena imágenes en gran medida en la base de datos. ¿Cuál es su punto de vista sobre esto? Soy más de un tipo para almacenar la ubicación en el sistema de archivos, que almacenarla directamente en la base de datos.
¿Cuáles crees que son los pros / contras?
Almacén de archivos. Los ingenieros de Facebook tuvieron una gran charla al respecto. Una de las cosas que se tomaron fue conocer el límite práctico de archivos en un directorio.
Aguja en un pajar: Almacenamiento eficiente de miles de millones de fotos
Almacenar una imagen en la base de datos todavía significa que los datos de la imagen terminan en algún lugar del sistema de archivos, pero están ocultos para que no pueda acceder a ellos directamente.
+ ves:
- integridad de la base de datos
- es fácil de administrar ya que no tiene que preocuparse por mantener el sistema de archivos sincronizado cuando se agrega o elimina una imagen
-ves:
- penalización de rendimiento: una búsqueda en la base de datos suele ser más lenta que una búsqueda en el sistema de archivos
- no puedes editar la imagen directamente (recortar, redimensionar)
Ambos métodos son comunes y practicados. Echa un vistazo a las ventajas y desventajas. De cualquier manera, tendrás que pensar en cómo superar las desventajas. El almacenamiento en la base de datos generalmente significa ajustar los parámetros de la base de datos e implementar algún tipo de almacenamiento en caché. El uso del sistema de archivos requiere que encuentre una manera de mantener sincronizada la base de datos del sistema de archivos +.
Aquí hay un interesante libro blanco sobre el tema.
A BLOB o no a BLOB: Almacenamiento de objetos grandes en una base de datos o un sistema de archivos
La respuesta es, depende." Ciertamente, dependería del servidor de base de datos y su enfoque para el almacenamiento de blobs. También depende del tipo de datos que se almacenan en blobs, así como de cómo se accede a esos datos.
Los archivos de menor tamaño se pueden almacenar y entregar de manera eficiente utilizando la base de datos como mecanismo de almacenamiento. Los archivos más grandes probablemente se almacenarían mejor utilizando el sistema de archivos, especialmente si se modificarán / actualizarán con frecuencia. (La fragmentación de las burbujas se convierte en un problema en lo que respecta al rendimiento.)
Aquí hay un punto adicional a tener en cuenta. Una de las razones que respaldan el uso de una base de datos para almacenar los blobs es el cumplimiento con ACID. Sin embargo, el enfoque que utilizaron los evaluadores en el documento técnico (opción de Registro masivo de SQL Server) que duplicó el rendimiento del servidor SQL, cambió efectivamente la "D" en ACID a una "d", ya que los datos del blob no se registraron La escritura inicial para la transacción. Por lo tanto, si el cumplimiento total de ACID es un requisito importante para su sistema, reduzca a la mitad las cifras de rendimiento de SQL Server para las escrituras de base de datos al comparar la E / S de archivos con la E / S de blob de base de datos.
Como con la mayoría de los problemas, no es tan simple como parece. Hay casos en los que tendría sentido almacenar las imágenes en la base de datos.
- ¿Está almacenando imágenes que están cambiando dinámicamente, por ejemplo, facturas y desea obtener una factura como estaba el 1 de enero de 2007?
- El gobierno quiere que mantengas 6 años de historia.
- Las imágenes almacenadas en la base de datos no requieren una estrategia de copia de seguridad diferente. Las imágenes almacenadas en el sistema de archivos hacen
- Es más fácil controlar el acceso a las imágenes si están en una base de datos. Los administradores inactivos pueden acceder a cualquier carpeta en el disco. Se necesita un administrador realmente determinado para ir a espiar en una base de datos para extraer las imágenes
Por otro lado hay problemas asociados.
- Requiere código adicional para extraer y transmitir las imágenes
- La latencia puede ser más lenta que el acceso directo a archivos
- Carga más pesada en el servidor de base de datos
Como han dicho otros, SQL 2008 viene con un tipo de Filestream que le permite almacenar un nombre de archivo o identificador como puntero en la base de datos y almacena automáticamente la imagen en su sistema de archivos, lo que es un gran escenario.
Si está en una base de datos más antigua, entonces diría que si la almacena como datos de blob, entonces realmente no va a sacar nada de la base de datos en la forma de buscar características, por lo que probablemente sea mejor para almacenar una dirección en un sistema de archivos, y almacenar la imagen de esa manera.
De esa manera también ahorra espacio en su sistema de archivos, ya que solo va a guardar la cantidad exacta de espacio, o incluso espacio compacto en el sistema de archivos.
Además, puede decidir guardar con alguna estructura o elementos que le permitan explorar las imágenes en bruto en su sistema de archivos sin ningún db hit, o transferir los archivos de forma masiva a otro sistema, disco duro, S3 u otro escenario, actualizando la ubicación en su programa, pero mantenga la estructura, una vez más sin mucho éxito tratando de sacar las imágenes de su base de datos al intentar aumentar el almacenamiento.
Probablemente, también le permitiría lanzar algún elemento de almacenamiento en caché, basado en urls de imagen comúnmente golpeados en su motor / programa web, por lo que también se está ahorrando allí.
Depende de la cantidad de imágenes que vaya a almacenar y también de sus tamaños. He usado bases de datos para almacenar imágenes en el pasado y mi experiencia ha sido bastante buena.
OMI, los pros de usar la base de datos para almacenar imágenes son,
A. No necesitas estructura FS para mantener tus imágenes
B. Los índices de la base de datos funcionan mejor que los árboles FS cuando se almacena una mayor cantidad de elementos
C. La base de datos optimizada de forma inteligente realiza un buen trabajo al almacenar en caché los resultados de la consulta
D. Las copias de seguridad son simples.
También funciona bien si tiene configurada la replicación y el contenido se entrega desde un servidor cercano al usuario.
En tales casos, la sincronización explícita no es necesaria.
Si sus imágenes serán pequeñas (por ejemplo, <64k) y el motor de almacenamiento de su base de datos admite BLOB en línea (en registro), mejorará aún más el rendimiento, ya que no se requiere una dirección indirecta (se logra la localidad de referencia).
El almacenamiento de imágenes puede ser una mala idea cuando se trata de un número pequeño de imágenes de gran tamaño. Otro problema con el almacenamiento de imágenes en db es que, metadatos como creación, fechas de modificación deben ser manejadas por su aplicación.
El problema de almacenar solo las rutas de archivo a las imágenes en una base de datos es que la integridad de la base de datos ya no puede ser forzada.
Si la imagen real a la que apunta el camino de archivo no está disponible, la base de datos sin saberlo tiene un error de integridad.
Dado que las imágenes son los datos reales que se buscan, y que pueden administrarse más fácilmente (las imágenes no desaparecerán repentinamente) en una base de datos integrada en lugar de tener que interactuar con algún tipo de sistema de archivos (si se accede al sistema de archivos de forma independiente, las imágenes PUEDEN "desaparecer" repentinamente, me gustaría almacenarlas directamente como BLOB o algo así.
El truco aquí es no convertirse en un fanático.
Una cosa a tener en cuenta aquí es que nadie en el campamento del sistema de archivos pro ha incluido un sistema de archivos en particular. ¿Significa esto que todo, desde FAT16 hasta ZFS, supera fácilmente a todas las bases de datos?
No.
La verdad es que muchas bases de datos superan a muchos sistemas de archivos, incluso cuando solo estamos hablando de velocidad en bruto.
El curso de acción correcto es tomar la decisión correcta para su escenario preciso, y para hacerlo, necesitará algunos números y algunas estimaciones de casos de uso.
En los lugares donde DEBE garantizar la integridad referencial y el cumplimiento de ACID, se requiere el almacenamiento de imágenes en la base de datos.
No puede garantizar transaccionalmente que la imagen y los metadatos sobre esa imagen almacenada en la base de datos se refieran al mismo archivo. En otras palabras, es imposible garantizar que el archivo en el sistema de archivos solo se altere al mismo tiempo y en la misma transacción que los metadatos.
En mi experiencia, a veces la solución más simple es nombrar las imágenes de acuerdo con la clave principal . Así que es fácil encontrar la imagen que pertenece a un registro en particular, y viceversa. Pero al mismo tiempo no está almacenando nada sobre la imagen en la base de datos.
En segundo lugar la recomendación sobre rutas de archivos. He trabajado en un par de proyectos que necesitaban administrar grandes colecciones de activos, y cualquier intento de almacenar cosas directamente en el DB resultó en dolor y frustración a largo plazo.
El único "pro" real que se me ocurre con respecto al almacenamiento en la base de datos es el potencial de los activos de imagen individuales. Si no hay rutas de archivo para usar, y todas las imágenes se transmiten directamente desde la base de datos, no hay peligro de que un usuario encuentre archivos a los que no debería tener acceso.
Sin embargo, parece que se resolvería mejor con un script intermediario que extrae datos de un almacén de archivos inaccesible a la web. Así que el almacenamiento DB no es REALMENTE necesario.
En un proyecto anterior, almacené imágenes en el sistema de archivos, y eso causó muchos dolores de cabeza con las copias de seguridad, la replicación y el sistema de archivos desincronizado con la base de datos.
En mi último proyecto, estoy almacenando imágenes en la base de datos y almacenándolas en el sistema de archivos, y funciona muy bien. No he tenido problemas hasta ahora.
En una empresa donde solía trabajar, almacenamos 155 millones de imágenes en una base de datos Oracle 8i (entonces 9i). Valor de 7,5 TB.
Esto puede ser un poco difícil, pero si está usando (o planea usar) SQL Server 2008, le recomiendo que eche un vistazo al nuevo tipo de datos de FileStream .
FileStream resuelve la mayoría de los problemas relacionados con el almacenamiento de los archivos en la base de datos:
- Los Blobs en realidad se almacenan como archivos en una carpeta.
- Se puede acceder a los Blobs usando una conexión de base de datos o sobre el sistema de archivos.
- Las copias de seguridad están integradas.
- La migración "simplemente funciona".
Sin embargo, el "cifrado de datos transparente" de SQL no encripta los objetos FileStream, por lo que si eso es una consideración, es mejor que los almacene como varbinary.
Del artículo de MSDN:
Las instrucciones Transact-SQL pueden insertar, actualizar, consultar, buscar y realizar copias de seguridad de los datos de FILESTREAM. Las interfaces del sistema de archivos Win32 proporcionan acceso de transmisión a los datos.
FILESTREAM utiliza el caché del sistema NT para almacenar en caché los datos del archivo. Esto ayuda a reducir cualquier efecto que los datos de FILESTREAM puedan tener en el rendimiento del Motor de base de datos. El grupo de búfer de SQL Server no se utiliza; por lo tanto, esta memoria está disponible para el procesamiento de consultas.
Estoy a cargo de algunas aplicaciones que manejan muchos TB de imágenes. Hemos encontrado que almacenar las rutas de los archivos en la base de datos es lo mejor.
Hay un par de cuestiones:
- El almacenamiento de la base de datos suele ser más costoso que el almacenamiento del sistema de archivos.
-
puede acelerar el acceso al sistema de archivos con productos estándar disponibles
- por ejemplo, muchos servidores web utilizan la llamada al sistema sendfile () del sistema operativo para enviar de forma asíncrona un archivo directamente desde el sistema de archivos a la interfaz de red. Las imágenes almacenadas en una base de datos no se benefician de esta optimización.
- Cosas como los servidores web, etc., no necesitan una codificación o procesamiento especial para acceder a las imágenes en el sistema de archivos.
-
Las bases de datos ganan donde la integridad transaccional entre la imagen y los metadatos son importantes.
- es más complejo administrar la integridad entre los metadatos de la base de datos y los datos del sistema de archivos
- es difícil (dentro del contexto de una aplicación web) garantizar que los datos se hayan vaciado en el disco en el sistema de archivos
Hemos implementado un sistema de imágenes de documentos que almacena todas sus imágenes en campos de blob SQL2005. Hay varios cientos de GB en este momento y estamos viendo excelentes tiempos de respuesta y poca o ninguna degradación del rendimiento. Además, en cumplimiento de las normativas, tenemos una capa de middleware que archiva los documentos recién publicados en un sistema de jukebox óptico que los expone como un sistema de archivos NTFS estándar.
Estamos muy satisfechos con los resultados, particularmente con respecto a:
- Facilidad de replicación y copia de seguridad
- Capacidad para implementar fácilmente un sistema de control de versiones de documentos.
La palabra en la calle es que a menos que usted sea un proveedor de base de datos que intente demostrar que su base de datos puede hacerlo (por ejemplo, decir que Microsoft se jacta de que Terraserver almacena millones de imágenes en SQL Server) no es una buena idea. Cuando la alternativa - almacenar imágenes en servidores de archivos y rutas en la base de datos es mucho más fácil, ¿para qué molestarse? Los campos de blob son como las capacidades todoterreno de los SUV: la mayoría de la gente no los usa, los que normalmente se meten en problemas, y luego están los que sí, pero solo por diversión.
La ruta a los archivos en la base de datos es definitivamente el camino a seguir. He escuchado historia tras historia de clientes con TB de imágenes que se convirtió en una pesadilla al tratar de almacenar una cantidad significativa de imágenes en una base de datos. El impacto por sí solo es demasiado.
Las imágenes estáticas pequeñas (no más de un par de megas) que no se editan con frecuencia, deben almacenarse en la base de datos. Este método tiene varias ventajas, incluida una portabilidad más sencilla (las imágenes se transfieren con la base de datos), una copia de seguridad / restauración más sencilla (las copias de seguridad se respaldan con la base de datos) y una mejor escalabilidad (una carpeta del sistema de archivos con miles de pequeños archivos en miniatura suena como una pesadilla de escalabilidad para yo).
Servir imágenes desde una base de datos es fácil, simplemente implemente un controlador http que sirva la matriz de bytes devuelta desde el servidor DB como una corriente binaria.
No estoy seguro de cuánto es un ejemplo del "mundo real", pero actualmente tengo una aplicación que almacena los detalles de un juego de cartas coleccionables, incluidas las imágenes de las cartas. Concedido, el recuento de registros de la base de datos es de solo 2851 registros hasta la fecha, pero dado que ciertas tarjetas se lanzan varias veces y tienen ilustraciones alternativas, en realidad fue más eficiente escanear el "cuadrado primario" de la obra y luego dinámicamente generar los efectos de borde y varios para la tarjeta cuando se solicite.
El creador original de esta biblioteca de imágenes creó una clase de acceso a datos que representa la imagen según la solicitud, y lo hace bastante rápido para la visualización y la tarjeta individual.
Esto también facilita la implementación / actualizaciones cuando se lanzan nuevas tarjetas, en lugar de comprimir una carpeta completa de imágenes y enviarlas por el conducto y asegurar que se cree la estructura de carpetas adecuada, simplemente actualizo la base de datos y el usuario la descarga nuevamente. Actualmente tiene un tamaño de hasta 56 MB, lo que no es excelente, pero estoy trabajando en una función de actualización incremental para futuras versiones. Además, hay una versión "sin imágenes" de la aplicación que permite a las personas que realizan una marcación por exceso de acceso obtener la aplicación sin demora en la descarga.
Esta solución ha funcionado muy bien hasta la fecha, ya que la aplicación en sí está orientada como una única instancia en el escritorio. Hay un sitio web donde se archivan todos estos datos para el acceso en línea, pero de ninguna manera utilizaría la misma solución para esto. Estoy de acuerdo en que el acceso a los archivos sería preferible porque se escalaría mejor a la frecuencia y al volumen de solicitudes que se realizan para las imágenes.
Esperemos que esto no sea demasiado balbuceo, pero vi el tema y quise proporcionar algunas de mis ideas desde una aplicación de pequeña / mediana escala relativamente exitosa.
Normalmente, no me gusta tomar la parte más costosa y difícil de escalar de su infraestructura (la base de datos) y poner toda la carga en ella. Por otro lado: simplifica en gran medida la estrategia de copia de seguridad, especialmente cuando tiene múltiples servidores web y necesita mantener sincronizados los datos.
Como la mayoría de las otras cosas, depende del tamaño esperado y el presupuesto.
Recientemente he creado una aplicación PHP / MySQL que almacena archivos PDF / Word en una tabla MySQL (hasta 40 MB por archivo hasta ahora).
Pros:
- Los archivos cargados se replican en el servidor de respaldo junto con todo lo demás, no se necesita una estrategia de respaldo por separado (tranquilidad).
- La configuración del servidor web es un poco más sencilla porque no necesito tener una carpeta / subidas y decirle a todas mis aplicaciones dónde está.
- Puedo usar las transacciones para editar las ediciones para mejorar la integridad de los datos, no tengo que preocuparme por los archivos huérfanos y perdidos.
Contras:
- mysqldump ahora toma mucho tiempo porque hay 500 MB de datos de archivo en una de las tablas.
- En general, no es muy eficiente la memoria / CPU en comparación con el sistema de archivos
Llamaría a mi implementación un éxito, se encarga de los requisitos de copia de seguridad y simplifica el diseño del proyecto. El rendimiento está bien para las 20-30 personas que usan la aplicación.
SQL Server 2008 ofrece una solución que tiene lo mejor de ambos mundos: el tipo de datos de flujo de archivos .
Manéjelo como una tabla normal y obtenga el rendimiento del sistema de archivos.
Según mi experiencia, tuve que gestionar ambas situaciones: imágenes almacenadas en la base de datos e imágenes en el sistema de archivos con la ruta almacenada en db.
La primera solución, las imágenes en la base de datos, es algo más "limpia" ya que su capa de acceso a datos tendrá que tratar solo con los objetos de la base de datos; pero esto es bueno solo cuando tienes que lidiar con números bajos.
Obviamente, el rendimiento del acceso a la base de datos cuando se trata de objetos binarios grandes se está degradando, y las dimensiones de la base de datos aumentarán mucho, lo que causará una nueva pérdida de rendimiento ... y normalmente el espacio de la base de datos es mucho más caro que el espacio del sistema de archivos.
Por otro lado, tener grandes objetos binarios almacenados en el sistema de archivos hará que tenga planes de respaldo que tengan que considerar tanto la base de datos como el sistema de archivos, y esto puede ser un problema para algunos sistemas.
Otra razón para utilizar el sistema de archivos es cuando tiene que compartir los datos de sus imágenes (o sonidos, videos, lo que sea) con acceso de terceros: en estos días estoy desarrollando una aplicación web que utiliza imágenes a las que se debe acceder desde "afuera". "mi granja de servidores web de tal manera que el acceso a una base de datos para recuperar datos binarios es simplemente imposible. Así que a veces también hay consideraciones de diseño que lo llevarán a una elección.
Considere también, al realizar esta elección, si tiene que lidiar con el permiso y la autenticación al acceder a objetos binarios: estos requisitos normalmente se pueden resolver de una manera más fácil cuando los datos se almacenan en db.
Si esta es una aplicación basada en la web, entonces podría haber ventajas al almacenar las imágenes en una red de entrega de almacenamiento de terceros, como el S3 de Amazon o la plataforma Nirvanix.
Si no está en SQL Server 2008 y tiene algunas razones sólidas para colocar archivos de imagen específicos en la base de datos, puede tomar el enfoque de "ambos" y usar el sistema de archivos como un caché temporal y usar la base de datos como el repositorio principal. .
Por ejemplo, su lógica de negocios puede verificar si existe un archivo de imagen en el disco antes de servirlo, recuperándose de la base de datos cuando sea necesario. Esto le ofrece la capacidad de múltiples servidores web y menos problemas de sincronización.
Una cosa que no he visto mencionar a nadie todavía, pero definitivamente vale la pena señalar es que hay problemas asociados con el almacenamiento de grandes cantidades de imágenes en la mayoría de los sistemas de archivos también. Por ejemplo, si adopta el enfoque mencionado anteriormente y nombra cada archivo de imagen después de la clave principal, en la mayoría de los sistemas de archivos se encontrará con problemas si intenta colocar todas las imágenes en un directorio grande una vez que alcanza una gran cantidad de imágenes ( por ejemplo, en los cientos de miles o millones).
Una vez que la solución común a esto es agruparlas en un árbol equilibrado de subdirectorios.
Una vez trabajé en una aplicación de procesamiento de imágenes. Almacenamos las imágenes cargadas en un directorio que era algo así como / images / [fecha de hoy] / [número de identificación]. Pero también extrajimos los metadatos (datos exif) de las imágenes y los almacenamos en la base de datos, junto con una marca de tiempo y tal.
Supuesto: la aplicación está habilitada para web / basada en web
Me sorprende que nadie haya mencionado esto realmente ... delegarlo a otros especialistas: use un proveedor de alojamiento de imágenes / archivos de terceros .
Almacene sus archivos en un servicio en línea pagado como
Otros hilos de hablando de esto here .
Este hilo explica por qué debe utilizar un proveedor de alojamiento de terceros.
Vale la pena. Lo almacenan eficientemente. No se puede cargar el ancho de banda de sus servidores a las solicitudes de los clientes, etc.