Le almacenar datos binarios en la base de datos o en el sistema de archivos?[cerrado]

StackOverflow https://stackoverflow.com/questions/662488

  •  20-08-2019
  •  | 
  •  

Pregunta

Esta es una pregunta que se le ha pedido antes (grande-texto-y-fotos-en-sql pero principalmente para los datos que serán modificado.En mi caso los datos serán almacenados y nunca cambió.Parece sensato mantener todo junto.

Existen razones por qué yo no debería almacén estático de datos binarios en una base de datos?

Suponiendo que es una buena cosa que hacer, ¿hay ventajas para almacenar dichos datos en tablas separadas?(Usted puede comenzar a darse cuenta ahora de que yo no soy un DB de expertos...)

Aclarar:Probablemente habrá no más de 10-20 usuarios, pero estos serán en los estados unidos y en el reino unido.Los datos binarios tendrá que ser trasladado en cualquier caso.

¿Fue útil?

Solución

La ventaja de almacenar datos en la base de datos es aprovechar los mecanismos de seguridad de la base de datos y reducir el costo de mantenimiento (copias de seguridad, ...). La desventaja es que aumenta la carga de la base de datos y consume conexiones (lo que puede ser costoso para los servidores de bases de datos con licencia por conexión). Si está utilizando SQL Server 2008, FILESTREAM podría ser un buen alternativa.

Por cierto, para aplicaciones web (o cualquier otra aplicación que pueda necesitar transmitir los datos), generalmente es más sensato almacenar datos fuera de DB.

Otros consejos

Todo esto habla de hacer un " seleccione * de la tabla " causar problemas de memoria y / o ancho de banda enormes cuando la tabla tiene un LOB no es un problema. Todo lo que se devuelve es un puntero al LOB en cuestión. No hay suficiente reputación para poner el comentario en contexto, pero las personas que lo vean deberían saber que NO es un problema.

La mayor desventaja si está almacenando BLOBS es el consumo de memoria. ¿Te imaginas lo que seleccionaría * de x para miles de registros con una imagen de 45k en cada uno?

Como dijo Mehrdad, también hay ventajas. Entonces, si decide seguir ese enfoque, debe intentar diseñar su base de datos para que la mayoría de las consultas arrojen menos resultados con datos BLOB en ellas. Tal vez, por ejemplo, establezca relaciones uno a uno para este propósito.

Abordando el problema desde un punto de vista de principios, existe una base de datos relacional (principalmente) para almacenar datos estructurados. Si no puede realizar una consulta o unirse a un elemento de datos, probablemente no pertenezca a la base de datos. No veo que se use un BLOB de imagen en una cláusula WHERE, por lo que diría que lo mantenga fuera de la base de datos. Un CLOB, por otro lado, se puede utilizar en consultas.

Estoy familiarizado con un proyecto OSS de bastante buen tamaño que tomó la decisión desde el principio de almacenar imágenes en la base de datos MySQL, y se ha demostrado que se encuentra entre las 3 malas ideas principales con las que han estado lidiando desde entonces. (Exacerbado por el hecho de que & Quot; refactor sin piedad & Quot; es anatema, pero esa es otra historia).

Entre los graves problemas que esto ha causado:

  1. Superando el tamaño máximo eficiente de la base de datos (mysql). (El espacio total requerido para las imágenes excede a todos los demás en al menos 2 órdenes de magnitud).

  2. Los archivos de imagen pierden su " fileness " ;. No hay tamaños de fechas, etc. a menos que se almacenen (de forma redundante) como fechas (que requieren código para la administración).

  3. Las secuencias de bytes arbitrarias no se procesan bien todo el tiempo, ya sea para almacenamiento o manipulación.

  4. " Nunca necesitaremos acceder a las imágenes externamente " es una suposición peligrosa.

  5. Fragilidad. Debido a que todo el arreglo es antinatural y delicado, y no sabes dónde morderá a continuación (contribuyendo a la mentalidad antirrefactora).

¿Los beneficios? Ninguno que se me ocurra, excepto que podría haber sido el camino de menor resistencia en ese momento.

Creo que esto depende de la aplicación de su edificio. Si está construyendo un sistema CMS, y el uso de los datos va a mostrar imágenes dentro de un navegador web, puede tener sentido guardar las imágenes en el disco en lugar de colocarlas en la base de datos. Aunque honestamente haría ambas cosas, lo que podría permitir agregar un servidor a una granja sin tener que copiar archivos por todas partes.

Otro caso de uso podría ser un objeto complejo, como un flujo de trabajo, o incluso un objeto comercial con muchas interdependencias. Puede serializar ambos en un formato binario o basado en texto y guardarlos en la base de datos. Entonces obtienes el beneficio de la base de datos: ATOMIC, copias de seguridad, etc ...

No creo que la gente deba usar select * consultas en primer lugar. Lo que debe hacer es proporcionar dos formas de obtener los datos. Uno de los métodos devuelve la información de resumen, el segundo devolvería el blob. No puedo imaginar por qué necesitarías devolver miles de imágenes a la vez.

Quien tuvo la idea de almacenar una imagen (u otro documento binario) en una base de datos no es alguien con quien estoy muy contento. Las bases de datos están destinadas al almacenamiento de [¿principalmente?] Datos INDEXABLES, DISCRETOS. No BLOB de datos binarios sin sentido. Si ha trabajado con BLOB para datos binarios de primera mano, ya lo sabe.

Debe almacenar una referencia al archivo en el sistema de archivos. La mejor práctica es un nombre de archivo, no una ruta absoluta (o incluso relativa).

Guardamos los archivos adjuntos en nuestro sistema, y no se puede cambiar un archivo adjunto, así que creo que estamos en la misma página con datos que "serán almacenados y nunca ha cambiado." Hemos decidido específicamente no para almacenar en la base de datos.Hicimos esto por dos razones, la sencillez, y de copia de seguridad/tiempo de recuperación.

La simplicidad en primer lugar:En nuestro caso estos se cargan los archivos adjuntos desde el explorador de usuario final, y que es más sencillo escribir en un directorio (en el servidor de DB) que es para luego transmitirlos hacia abajo el SQL de la tubería.Hay un registro de ellos en la DB, pero la base de datos sólo contiene meta-información sobre el apego, y el nombre del archivo en el disco (un guid en nuestro caso)

En la copia de seguridad/recuperación de lado:Estos blobs probablemente se convierta en uno de los más grandes piezas de la base de datos.Cada vez que se ejecuta una copia de seguridad completa de que usted va a ser la copia de estos bits más y más, aunque usted sabe, no se puede cambiar.Nos parecía mucho más simple tener (mucho) menor copias de seguridad, y hacer un xcopy de la fijación de directorio a un servidor secundario como la copia de seguridad.

¿No es esto exactamente lo que se diseñaron los LOB o CLOB o ...?

Utilizamos CLOB para almacenar grandes encriptaciones de transacciones con tarjeta de crédito para un sistema de una aerolínea importante.

Sin embargo, el consumo de memoria es tu mayor culpable.

HTH

aplausos,

Algunas bases de datos (por ejemplo, Postgresql) comprimen automáticamente los campos, tal vez es más rápido cuando los lee directamente desde db. Y también, el programa puede leer todos los campos e imágenes de una sola vez.

El problema de rendimiento aquí como se mencionó anteriormente, así que no lo repetiré. Pero creo que un buen consejo si está almacenando cosas que se transmitirán mucho (como imágenes / documentos en un sitio web) es construir en un sistema de almacenamiento en caché.

Con esto quiero decir almacenar todos los datos en su base de datos, pero cuando alguien solicite ese archivo, verifique si existe en el disco (basado en un nombre de archivo conocido, en una carpeta temporal), si no, cójalo de la base de datos y escríbalo en la carpeta y luego transmítalo al usuario. Para la siguiente solicitud al mismo archivo, dado que existe en el disco, se puede servir desde allí sin presionar la base de datos. Pero si necesita eliminar estos archivos (¡o su servidor web se convierte en kapput!), No importa, ya que serán reconstruidos nuevamente desde la base de datos a medida que la gente los solicite. Esto debería ser mucho más rápido que atender cada solicitud para el mismo archivo de la base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top