Ir al contenido


Foto

Almacenamiento de imágenes en MySQL


  • Por favor identifícate para responder
3 respuestas en este tema

#1 JRichard

JRichard

    Advanced Member

  • Miembros
  • PipPipPip
  • 67 mensajes

Escrito 21 abril 2014 - 09:58

Saludos.

Quisiera saber que opinan sobre el almacenamiento de imágenes en MySQL. Actualmente estoy realizando un aplicación y debo guardar la foto de los Empleados. Hace tiempo realice una aplicación que a vista del usuario permitía guardar imágenes en la BD pero en realidad lo que guardaba era la ruta de la imagen y la imagen la almacenaba en una carpeta. Lo hice de esta forma ya que los profesores de la universidad siempre me recomendaron este método. Luego comencé a trabajar con Firebird y me olvide por un tiempo de MySQL jejeje! Debido a esto no indague más sobre el asunto.

He navegado un buen rato y lo que consigo son indecisiones, algunas personas dicen que si es recomendable otras que no porque la base de datos se vuelve muy lenta (Algo que no creo completamente válido para esta época, ya las computadoras no trabajan a la misma velocidad y almacenan la misma cantidad de datos que hace 3 años) pero bueno es mejor consultar a personas con experiencia y salir de dudas. Tengo entendido que para almacenar imágenes se usan los diferentes tipos de datos BLOB.

Me gustaría guardarlas en la Base de Datos ya que almacenar imágenes en un carpeta dentro del proyecto me parece que es algo inseguro, cualquier persona con conocimientos puede entrar y borrarla.

A ver, ¿Que me recomiendan?.  :)
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 abril 2014 - 10:58

Este tema es un eterno debate. Y no creo que le encuentres una respuesta definitiva que termine con la discusión.
Se pueden encontrar pros y contras a ambas corrientes. La decisión final pasará por analizar caso a caso y determinar las necesidades técnico-operativas junto a las restricciones técnico-operativa y legales.
Hay múltiples factores a considerar: tamaños de las imágenes, tasa de crecimiento de la base de datos estimada por año y proyectada a cierto tiempo, volúmen de operaciones diarias y sobre todo si constantemente se va a estar realizando operaciones ABM sobre las imágenes, si se va a ser necesario llevar un histórico de tales cambios.

Respecto a que el poder de una máquina es superior con los años eso no te lo discuto pero ten en cuenta que en la misma medida en que avanza la tecnología aumenta la misma demanda de hacer más cosas al mismo tiempo y hasta las necesidades y volúmen de datos tienden a un ritmo exponencial.
Esto hace que si bien las máquinas son cada vez más superiores, sigue existiendo esfuerzo por hacer de los sistemas algo más eficiente, rápido, y menos invasivo en cuanto a recursos (ram, disco, etc).
¿Entiendes algo sobre notación O y/o complejidad computacional? Espero que sí porque voy a ilustrarte el porqué es una buena razón que nuestros sistemas sean eficientes y estén bien pulidos.
Digamos que tengo un sistema cuya funcionalidad sea procesar un volumen de datos y tras un análisis de los algoritmos se ha determinado que su complejidad computacional es O(n^2); siendo n dicho volumen.
Hagamos algunos cálculos, supongamos el hipotético caso en que el valor de la constante c=2.
n = 10 >> O(10^2) = c100 = 200 mseg
n = 100 >> O(100^2) = c10000 = 20000 mseg
n = 1000 >> O(1000^2) = c1000000 = 2000000 mseg

Han pasado 2 años, han adquirido un nuevo equipo, que ofrece una c=1. Es decir que es el doble de rápida. Los cálculos para esta máquina indican:
n = 10 >> O(10^2) = c100 = 100 mseg
n = 100 >> O(100^2) = c10000 = 10000 mseg
n = 1000 >> O(1000^2) = c1000000 = 1000000 mseg

Hasta allí todo bien, y no pareciera ser problema. Pero he aquí que durante estos dos años el volumen de los datos no creció en la misma progresión lineal que el poder de la tecnología y fue un año bastante productivo... tenemos ahora en realidad 4 veces lo producido. Veamos que sucede:

n = 40 >> O(40^2) = c1600 = 1600 mseg
n = 400 >> O(400^2) = c160000 = 160000 mseg
n = 4000 >> O(4000^2) = c16000000 = 16000000 mseg

Aún cuando el volumen de datos fuera el doble, los números indicarían un crecimiento en los tiempos de procesamiento. Todo por ese pobre algoritmo que ya no está a la altura.

Suponte que la competencia, con un mejor sentido de la proyección de la demanda de procesamiento y el volumen de datos destinó mucho esfuerzo en hacer de su producto y consguió hacer un sistema que es capaz de resolver todo en O(n log n)*.

*Recuerda que en complejidad computacional, log corresponde a Log2 o logaritmo de base 2.

Para el equipo viejo (el de c=2) sus tiempos son (redondeado hacia arriba):
n = 10 >> O(10 log 10) = c34 = 68 mseg
n = 100 >> O(100 log 100) = c665 = 1330 mseg
n = 1000 >> O(1000 log 1000) = c9966 = 19932 mseg

Para cuando aparece el nuevo equipo (c=1) y con la demanda (4x) prevista entonces:
n = 40 >> O(40 log 40) = c213 = 213 mseg
n = 400 >> O(400 log 400) = c3458 = 3458 mseg
n = 4000 >> O(4000 log 4000) = c47863 = 47863 mseg

¿Viste en cómo a pesar de que el poder computacional ayuda mucho, el contar con un buen algoritmo y preveer la demanda a funturo es una herramienta que mejorará las cosas?

Por ello es que existe un enorme esfuerzo en la comunidad científica de la informática (cuyo perfil está cubierto por lo general de la ciencias en [de/la] computación) en producir métodos y llevar estudios y análisis de algoritmos cada vez más bajos y lineales posibles. Un ejemplo de ello lo puedes ver en TimSort, que es un algoritmo de ordenamiento bastante reciente comparado con los tradicionalmente conocidos. TimSort ofrece un O(n log n) en el peor caso y en el mejor caso es O(n). Hace poco que algunos lenguajes y bibliotecas se lo ha incorporado como algoritmo por defecto. Los demás siguen utilizando QuickSort por defecto**.

** Bueno, también hay que considerar que no todos los algoritmos de ordenamiento son aplicables así como así sino que dependiendo de ciertas necesidades, el tipo de datos y el contexto o naturaleza del problema hay algoritmos que pueden ser más útiles que otros; aún cuando la teoría dice QS "es el rey".

Y así como he expuexto esto en base a la complejidad computacional, también se puede llevar el análisis por el consumo de memoria, ancho de banda/uso de red consumido, etc.

Asi que mi consejo a todos los que piensan en "el poder de la máquina lo compensa", mejor lo revean.  ;)

Saludos,
  • 0

#3 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 22 abril 2014 - 07:04

Excelente articulo Delphius, definitivamente no hay una ley o norma que indique como utilizarse, depende de muchos factores.

Es de aclarar que un buen diseño tanto de la base de datos como del programa hace la diferencia entre una aplicación Profesional y una amateur,  no es suficiente con que funcione, es importante que lo haga eficientemente.

Para ser un poco más práctico, lo que he utilizado y me ha ido bien (Si te sirve de guía) es que NUNCA utilizo imágenes dentro de la base de datos cuando el volumen de movimiento de esa tabla es alto,  en otras palabras si son tablas transaccionales o realizas muchas consultas sobre esa tabla, no utilizo imágenes.

Se puede hacer pequeño truco y es almacenar las imágenes en una tabla diferente (Algunas bases de datos lo hacen así por defecto) para no alterar las lecturas de cada registro.  Esto sería tener una tabla solo con el código y la imagen, y en la tabla principal solamente se guarda el código.

Y finalmente está la técnica de almacenar las imágenes en carpetas y almacenar en la base de datos el nombre del archivo.

En forma práctica 3 métodos válidos, ya depende varios factores para que tomes un camino o el otro.

Saludos.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 abril 2014 - 07:32

Excelente articulo Delphius, definitivamente no hay una ley o norma que indique como utilizarse, depende de muchos factores.

Es de aclarar que un buen diseño tanto de la base de datos como del programa hace la diferencia entre una aplicación Profesional y una amateur,  no es suficiente con que funcione, es importante que lo haga eficientemente.

Para ser un poco más práctico, lo que he utilizado y me ha ido bien (Si te sirve de guía) es que NUNCA utilizo imágenes dentro de la base de datos cuando el volumen de movimiento de esa tabla es alto,  en otras palabras si son tablas transaccionales o realizas muchas consultas sobre esa tabla, no utilizo imágenes.

Se puede hacer pequeño truco y es almacenar las imágenes en una tabla diferente (Algunas bases de datos lo hacen así por defecto) para no alterar las lecturas de cada registro.  Esto sería tener una tabla solo con el código y la imagen, y en la tabla principal solamente se guarda el código.

Y finalmente está la técnica de almacenar las imágenes en carpetas y almacenar en la base de datos el nombre del archivo.

En forma práctica 3 métodos válidos, ya depende varios factores para que tomes un camino o el otro.

Saludos.

Desconozco como maneja los BLOBs internamente MySQL pero Firebird al menos los almacena de forma separada que los otros registros. Es decir que no los almacena en forma conjunta con el resto de los campos. Reserva un lugar para éstos y genera una especie de puntero que lo vincula con el registro en cuestión. Esto hace que lamentablemente cuando se realiza un select que combine los blobs con los otros campos sea un poco más lento que operar directamente sobre los campos normales.

Evidentemente no hay respuesta definitiva... es el Ying-Yang.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.