Nueva pregunta

Pregunta:

Fecha: 29-08-2015 15:09:17 (En Español)

Ventajas y desventajas de guardar imagenes en la base de datos[Resuelta]

Hola comunidad, el objetivo de esta pregunta es que todos colaboremos en listar las ventajas y desventajas de guardar imagenes en la base de datos con respecto al sistema de archivos (filesystem).

Espero sus comentarios, muchas gracias.

Saludos,
Fernando
Etiquetas: MySQL - MySQL Administración - MySQL Desarrollo - MySQL Optimizacion - Pregunta Votos: 3 - Respuestas: 13 - Vistas: 76 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 30-08-2015 00:24:04 Ventajas:
    1. Seguridad. Los archivos no están a simple vista, no se pueden ejecutar desde el sistema si se sube algún tipo de archivo malicioso.
    2. Único origen de datos. No tienes datos distribuidos en el sistema de archivos y la base de datos, todo está centralizado en un mismo punto y eso permite que sea más fácil importar y exportar tu información a diferente lado.
    3. Dependiendo del tipo de archivo puedes aprovechar las herramientas de búsqueda del motor de BD para buscar en el contenido del mismo.
    4. No dependes de una ruta para servir los archivos.
    Desventajas:
    1. Más información en la base de datos.
    2. La administración de archivos se puede volver engorrosa, sobre todo si quieres manejar paths virtuales.
      Votos: 1 - Link respuesta
     
  • Fecha: 30-08-2015 04:25:21 Muy buena lista Ernesto, agrego estos puntos:

    Desventajas de persistir archivos / imagenes en base de datos:
    * Tiempo de acceso a los archivos: siempre es más rapido el acceso a filesystem que a una base de datos (la db requiere conexión, autenticación, autorización, etc).
    * Incremento en tamaño de la base de datos: si debemos persistir una gran cantida de archivos y/o pocos pero de gran tamaño, esto hará que nuestra base de datos se incremente en tamaño, y en consecuencia su administración será más complicada (backups y restores mas lentos, tiempos de bloqueo de la base de dato mayores).
    * Acceso diferido a los archivos: al persistir los archivos en una base de datos, para accederlos siempre se requerirá de un cliente de base de datos que lea el contenido y luego nos lo presente en forma de archivo. En el caso de filesystem podremos acceder directamente a los archivos físicos.
    * Mayor complejidad: la persistencia en base de datos requiere un mayor conocimiento técnico y más código/procesos/validaciones que en el caso del filesystem.
    * Aumento de los requerimientos de infraestructura: se requiere de mayor memoria RAM, procesador, espacio en disco, etc., requerimientos especificados por el DBMS a ser utilizado en la persistencia de archivos (en la práctica, por lo general ya estamos usando un DBMS para nuestro sistema, por lo que el incremento en infraestructura no suele ser considerable, distinto sería si tuvieramos que considerar implementar persistencia en base de datos en un sistema que no utiliza una base de datos).

    Ventajas de persistir archivos / imagenes en base de datos:
    * Concurencia: acceso concurrente a los archivos, manejado por el DBMS (Database Management System).
    * Orden de los archivos: los archivos quedan almacenados coherentemente en tablas de la base de datos, en el caso del filesystem se tiende al desorden en carpetas.
    * Mantenimiento de la aplicación: al tener los datos separados del código de nuestra aplicación se facilita el mantenimiento / actualización de la misma.


    Hay otros puntos de los cuales se podría hablar, como ser: costos, normalización, integridad de datos, transacciones, etc.

    Muchas gracias a todos por sus contribuciones.

    Saludos,
    Fernando
      Votos: 1 - Link respuesta
     
  • Fecha: 30-08-2015 10:03:49 Y como afecta al CEO y a los buscadores?   Votos: 1 - Link respuesta
     
  • Fecha: 30-08-2015 13:10:20 El tema merece toda mi atención (desde mi experiencia e interés en imágenes).
    Y me surgen más preguntas que afirmaciones.

    Walter, creo que te refieres a SEO (Search Engine Optimization - Posicionamiento en buscadores). Todo un capitulazo. Excelente pregunta.

    (Uno u otro sistema - preguntas)
    - Carga de imagen en uno y otro sistema.
    - Caché. (¿cómo funciona en uno y otro caso, en diferentes navegadores?).
    - ¿Base de datos diferente para imágenes en el caso de almacenarlas en base de datos y no el enlace hacia filesystem (Sistema de archivos)?. Sería lo sensato porque crear una tabla en la misma base de datos, ...
    - Funcionabilidad en los smarphones y tablets de uno u otro sistema.

    Ustedes saben que trabajo abundantemente con google maps. Desde los más expertos hasta el propio Google Maps (y en ese orden porque nos obligan a trabajar con otras librerías y datos) no se plantea la cuestión. Se deriva hacia las carpetas de archivos y el enlace hacia la ruta de imagen (¿? supongo que será por algo).

    ¿Seguridad? Entiendo la teoría pero no veo diferencias en la práctica.
    ¿Orden? Tal vez por ignorancia pero no me lo cuestiono. Generalmente tengo varias carpetas de archivos de imágenes (las generales, los iconos, las particulares a proyectos definidos, ...).

    Personalmente en DB guardo enlaces hacia carpetas. Sería excelente si me convencen hacia la optimización de guardar las imágenes en base de datos. Sería una gran noticia.

    (No lleguemos a la historia del cuerdo en la isla de los locos).
      Votos: 2 - Link respuesta
     
  • Fecha: 30-08-2015 14:46:23 *.- El hecho de guardar la imagen a la BD, dependiendo del peso de la imgen guardada, va a hacer que cuando uno hace una peticion a la BD la respuesta sea lenta.
    *.- Como bien dice Fernando, tambien hace que el peso de la BD sea significativa
      Votos: 2 - Link respuesta
     
  • Fecha: 30-08-2015 14:58:34 Independientemente un dato interesante:
    Tengo un caso donde debo por medio de un Form subir varios archivo (Imagenes), simultaneamente, fu algo que en lo particular me costo mucho y con ayuda de terceros.
    Puedo dejar mi script por si alguien lo necesita o me gustaria ver como lo a resuelto otro.
    Espero opiniones.
      Votos: 1 - Link respuesta
     
  • Fecha: 31-08-2015 15:09:33 Artzain: efectivamente me refería al SEO (Search Engine Optimization - Posicionamiento en buscadores). Como lo afectaría. Por lo poco que tengo entendido es un tema muy complejo.

    En mi escaso conocimiento y humilde opinión, especulando un poco creo que las imágenes en una DB se haría excesivamente grande, y la performance de la misa se reduciría significativamente, ademas de ocupar un espacio que podría ser utilizado por otros tipos de datos.

    Daniel si quieres compartir y publicar tu codigo, tal vez lo podes hacer en una pregunta, en el titulo anteponiendo [Recurso compartido] o algo similar a fin de que no se tome como una pregunta.
    Daniel por supuesto que son muy bienvenidas todas tus contribuciones.

    Saludos
      Votos: 2 - Link respuesta
     
  • Fecha: 01-09-2015 05:36:00 Gente:
    Aqui les dejo mi codigo, para que se mejore y discuta:
    En este ejemplo, se debe guardar en una BD la documentacion de cada Vehiculo de la empresa.
    Ejemplo: Puse 9 pero son muchos mas (Cedula verde, VTV, Polizas de Seguro, etc)

    Objetivo:

    a) Subir varias imagenes simultaneamente
    b) Guardar la ruta de la imagen en sus respectivos campos de la BD (Ejem: Campo vtv)
    c) Guardar cada imagen en distintas carpetas (Ejemplo las imagenes de VTV en una carpeta upload_vtv)

    *** Aclaracion Pertinente:
    No pase la pagina_1.php que es la que contiene el FORM que pasa las variables, porque comprendo que eso se entiende.

    Script: pagina_2.php

    <?php
    /**
     * Conexion a BD
     */
    require('conexion.php');
    error_reporting(0);
    
    /**
     * [$id_usuario Capturo las variables enviadas por el FORM por metodo POST desde pagina_1.php]
     * @var [int]
     */
    
    $id_veh=$_POST['id_veh'];
    
    /**
     * Proceso de las imagenes.
     * Objetivo 1: Guardar la ruta de la imagen en sus respectivos campos de la BD (Ejem: Campo vtv) 
     * Objetivo 2: Que cada imagen se guarde en una carpeta distinta con la finalidad de poder localizar a cada una mas facilmente y poderlas manipular 
     */
    
    $archivos = array();
    
    					array_push($archivos, array("id_veh"  => "foto",
    												"nombre"  => $_FILES["foto"]['name'],
    												"destino" => "../../upload_foto_vehiculo/".$_FILES["foto"]['name']));	
    								
    					array_push($archivos, array("id_veh"  => "cedula_verde",
    												"nombre"  => $_FILES["cedula_verde"]['name'],
    												"destino" => "../../upload_cedula_verde/".$_FILES["cedula_verde"]['name']));												
    											
    					array_push($archivos, array("id_veh"  => "titulo",
    												"nombre"  => $_FILES["titulo"]['name'],
    												"destino" => "../../upload_titulo_automotor/".$_FILES["titulo"]['name']));
    												
    					array_push($archivos, array("id_veh"  => "oblea_equipo_gnc",
    												"nombre"  => $_FILES["oblea_equipo_gnc"]['name'],
    												"destino" => "../../upload_oblea_equipo_gnc/".$_FILES["oblea_equipo_gnc"]['name']));
    												
    					array_push($archivos, array("id_veh"  => "oblea_cilindro_gnc",
    												"nombre"  => $_FILES["oblea_cilindro_gnc"]['name'],
    												"destino" => "../../upload_oblea_cilindro_gnc/".$_FILES["oblea_cilindro_gnc"]['name']));	
    								
    					array_push($archivos, array("id_veh"  => "oblea_matafuego",
    												"nombre"  => $_FILES["oblea_matafuego"]['name'],
    												"destino" => "../../upload_oblea_matafuego/".$_FILES["oblea_matafuego"]['name']));												
    											
    					array_push($archivos, array("id_veh"  => "permiso_microcentro",
    												"nombre"  => $_FILES["permiso_microcentro"]['name'],
    												"destino" => "../../upload_permiso_microcentro/".$_FILES["permiso_microcentro"]['name']));
    
    					array_push($archivos, array("id_veh"  => "vtv",
    												"nombre"  => $_FILES["vtv"]['name'],
    												"destino" => "../../upload_vtv/".$_FILES["vtv"]['name']));		
    												
    					array_push($archivos, array("id_veh"  => "poliza_src",
    												"nombre"  => $_FILES["poliza_src"]['name'],
    												"destino" => "../../upload_poliza_src/".$_FILES["poliza_src"]['name']));												
    					/**
    					 * Tengo un array[de varios array_push[que a su vez contienen varios elementos cada uno]]
    					 * Hago que cada array_push me devuelva el nuevo número de elementos del array para esa posicion
    					 */
    					foreach($archivos as &$archivo){
    													if($archivo["nombre"] != ''){  
    													if (move_uploaded_file($_FILES[$archivo["id_veh"]]["tmp_name"], $archivo["destino"])) {
    													//echo "Archivo subido: <b>".$archivo["nombre"]."<b><br>";    
    													} 
    													else{
    													//echo "Error al subir el archivo<br>";
    													} 
    						                            }
    					                                }
    
    /**
     * [$sql Ingreso los registros en la tabla avisos]
     * @var string
     * Observaciones Pertinentes: Previamente se debe crear por cada imagen una carptea upload_algo
     */
    $sql =	"INSERT INTO veh (id_veh,
    	                      foto, 
    	                      cedula_verde, 
    	                      titulo, 
    	                      oblea_equipo_gnc, 
    	                      oblea_cilindro_gnc, 
    	                      oblea_matafuego, 
    	                      permiso_microcentro,
                              vtv, 
                              poliza_src) 
                    values(
                    	        "."'".$id_veh."',  
    							"."'../../upload_foto_vehiculo/".$_FILES['foto']['name']."',
    							"."'../../upload_cedula_verde/".$_FILES['cedula_verde']['name']."',
    							"."'../../upload_titulo_automotor/".$_FILES['titulo']['name']."',
    							"."'../../upload_oblea_equipo_gnc/".$_FILES['oblea_equipo_gnc']['name']."',
    							"."'../../upload_oblea_cilindro_gnc/".$_FILES['oblea_cilindro_gnc']['name']."',
    							"."'../../upload_oblea_matafuego/".$_FILES['oblea_matafuego']['name']."',
    							"."'../../upload_permiso_microcentro/".$_FILES['permiso_microcentro']['name']."',
    							"."'../../upload_vtv/".$_FILES['vtv']['name']."',
    							"."'../../upload_poliza_src/".$_FILES['poliza_src']['name']."'" ."	
    							)";										   
    		
    $resultado=mysqli_query($sql,$conexion);
    
    /**
     * Mensaje: Para que el Data Enter visualice que el registro se cargaro correctamente o no en la tabla
     */
    if($resultado) 
    { 
    
    /**
     * Si se insertó, mostramos un mensaje en JavaScript confirmando
     */
    
    echo 
    "<script language='javascript'>
    alert('Sus informacion fue ingresada correctamente.')
    window.location.href= 'pagina_1.php' 
    </script>"; 
    
    } 
    else 
    { 
    
    /**
     * Si no se insertó, mostramos un mensaje avisando tal error
     */
    echo 
    "<script language='javascript'>
    alert('ERROR - Los datos ingresados no son correctos, verifique el peso de sus imagenes e intente nuevamente.')
    window.location.href= 'pagina_1.php' 
    </script>"; 
    }
    
    ?>


    Un saludo
      Votos: 2 - Link respuesta
     
  • Fecha: 01-09-2015 09:27:36 Hola, me desconecté un tiempo por trabajo.
    Ok hay que acotar escenarios. Dependiendo de las necesidades se tomará la decisión de utilizar una Base de datos para almacenar archivos o no.
    Hay que estar conscientes y evaluar correctamente lo que tu sistema quiere lograr y las ventajas y desventajas de tus orígenes de datos.
    Por ejemplo, utilizaría el sistema de archivos para una página web pero si quiero crear un gestor de archivos privados entonces me inclinaría por utilizar la BD.
    Respecto a la seguridad, es una diferencia enorme, un tipo de archivo con contenido malicioso puede provocar serios problemas si lo colocas en el sistema de archivos si llega a ser interpretado por el sistema o puede sobreescribir datos o estar robando datos pasivamente mientras que si lo almacenas en la base de datos lo mantienes como una fuente de datos que no se puede ejecutar naturalmente o por accidente.
    Obviamente si lo almacenas en la base de datos genera otras cosas de las que debes estar pendiente como tamaño, velocidad de respuesta, etc. Hoy en día eso ya no es problema pues tienes muchas soluciones como cacheo, bases de datos distribuidas, sharding, SAN, etc.
    Hablando de SEO sólo me preocuparían aquellos archivos que quisiera que estuvieran disponibles y en su caso no hay problema, utilizarías el mismo principio de un frontcontroller que se encargaría de descargar el archivo y la metadata sería parte de una o varias columnas en la base de datos.
      Votos: 3 - Link respuesta
     
  • Fecha: 01-09-2015 10:07:23 Ernesto:
    Cada caso es un mundo.
    En lo particular, utilizo las imagnes como elemento de control, ya que debo auditar, teniendo como exigencias de mi cliente el porder verificar el estado documental y de pagos impositivos de su proveedor.
    Por lo tanto a diario los proveedores de mi cliente, ingresan a la pagina con la finalidad de cargar sus obligaciones proximas a vencer (Caso contrario no pueden prestar servicios).
    On line uno verifica la informacion registrada y lo autoriza o no.
    No obstante por razones de seguridad (Normas ISO 9001), los Clientes de mi cliente, tambien pueden constatar si los proveedores de mi cliente cumplen con las normas (Cuestiones de responsabilidad solidaria en la cadena).
    Al ser tantas las imagenes que se registran a diario, resultaria imposible administrarlas desde una BD, ya que estos procesos serian muy lentos. Sin embargo al guardar la ruta de la imagen, todo esto es mas rapido y sencillo.
    Un saludo
      Votos: 3 - Link respuesta
     
  • Fecha: 01-09-2015 10:42:22 Exacto!
    Depende de la necesidad que tengas.
    En mi caso generalmente si es una página donde necesito administrar manuales, imágenes, documentos públicos, etc. con el sistema de archivos es más que suficiente.
    El caso en que utilicé la base de datos fue muy puntual y por las características del proyecto se concluyó que era la mejor opción a tomar.
    Creo que los ejemplos de cada uno son muy esclarecedores. Este tema ha sacado cosas muy interesantes.
      Votos: 2 - Link respuesta
     
  • Fecha: 02-09-2015 03:38:03 Walter, para el SEO el destino de persistencia (ya sea base de datos o filesystem) es indistinto, ya que los crawlers de los buscadores (quienes indexan tus imagenes) no tienen forma de discriminar el origen de persistencia.

    Como todos saben, para mostrar una imagen se requiere de la etiqueta html img con el atributo src apuntando a la URL de la imágen (de forma relativa o absoluta), ahora bien, para SEO es importante incorporar el atributo alt que describe con un texto a la imagen en custion.

    <img src="URL_IMAGEN" alt="TEXTO PARA SEO" />


    Otra recomendación SEO es la colocación de las palabras claves en la URL_IMAGEN, por ejemplo, si lo que mostramos es la imagen de una cupe italiana color rojo, sera mejor una url como: .../imagenes/cupe_italiana_color_rojo.jpg que algo como .../imagenes/43.jpg

    En el caso que persistamos en una base de datos (no necesariamente el archivo, pero si su metadata *1), podremos guardar campos extras de SEO y confeccionar la URL a la imagen de una forma amigable, supongamos algo como: .../imagenes/43/cupe_italiana_color_rojo.jpg

    Espero haber aclarado el punto.

    Saludos,
    Fernando

    *1 metadata: ubicación en disco de la imágen, texto alt descriptivo de la imagen, mime type (jpg, png, gif, etc), texto seo para la url, etc.
      Votos: 3 - Link respuesta
     
  • Fecha: 04-09-2015 12:15:24 Reiterando lo dicho por Fernando: El atributo alt es importantísimo para SEO de imágenes.

    Como se ha reiterado, el capítulo SEO es un mundo aparte. Y Mi$ter Google (en torno al 90% de la influencia en buscadores) se apoya mucho en HTML5 y sus etiquetas (header, <h?>, negrita ...), más allá de lo que nos enseñaron del <meta name="keywords" content="...">

    Saludos.
      Votos: 2 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com