Ir al contenido


Foto

Almacenamiento de imágenes en Firebird


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 febrero 2017 - 09:38

Normalmente, guardo las imágenes físicamente en una carpeta y la ruta en la BD, pero dada algunas situaciones que se han presentado en la red (y Servidor), las imágenes se pierden ya sea por infección de virus (en este caso el famoso hackeo .zepto) ó por pérdida, me he visto forzado guardar las imágenes en la BD, tengo pensado crear otra base de dato separado sólo para guardar esas imágenes y hacer la conección a ella cuando se requiera, quería preguntarles si conocen otro método mejor ó si lo que ya planteo es suficiente.

 

Nota.: Estamos cansados de hacer restauraciones porque se nos hace tedioso la situación.

 

Saludos.


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 febrero 2017 - 11:21

¿Por restauraciones te refieres a un Restore de una DB o la de un equipo?

 

Tener las imágenes en una DB secundaria puede ayudar a acelerar un poco más las cosas. Aunque por diseño Firebird se encarga de guardar los blobs en un "sector" propio dentro de la DB por lo que operaciones tradicionales no se ven afectadas por la existencia de un blob. La única excepción es cuando explícitamente se invoca en alguna operación al campo blob. Por ejemplo un SELECT todos los campos excepto blob FROM tabla funcionará igual de eficiente y rápido sobre una tabla idéntica que no tuviera el campo blob. Pero un SELECT * si dispondrá del blob y ahora si se apreciaría una baja en el rendimiento (en particular cuando uno esta recorriendo el conjunto de datos y/o moviendo el cursor).

 

La otra ventaja de tener los blobs por aparte es que hacer un Backup&Restore es mucho más rápido. Y si no es tan necesario, o prioritario, tener a la par un Backup&Restore actualizado cada vez que lo realizas sobre la DB principal ya ganas otro plus ya que no tienes que estar todo el tiempo dedicandole "service".

Generalmente lo que se suele guardar en un BLOB, no suele tocarse ni cambiarse demasiado. Es más hasta en ocasiones no se cambiará nunca. La situación ideal es cuando el BLOB es destinado para algo secundario y en donde lo típico es apenas una consulta y que incluso rara vez se presente.

Ahora bien, si en realidad el trabajo de los usuarios (y por los propios procesos y actividades dentro de la empresa) depende muchísimo de tener las fotos disponibles, pienso que vale la pena tener un proceso en el que se priorice medidas que den seguridad ante un fallo por ejemplo. Ahí, es importante conservar un respaldo de esa DB secundaria.

 

Ahora, una posible desventaja de tenerlas fuera de la DB principal. Firebird 2.1 y versiones inferiores (no recuerdo si también afecta a 2.5) no tiene capacidad de hacer consultas externas. No es posible consultar y cruzar dos bases de datos. Asi que por ejemplo, si la idea es que las fotos estén asociadas a algunos registros de la DB principal y usas 2.1- para aprovechar mejor los recursos del server sería que esten en una misma DB. De otra forma deberás tener dos conexiones activas en tu aplicación (o bien, una y estar cerrando y abriendo cada una cuando sea necesario), una para cada DB y hacer la "correspondencia" a mano.

 

Ahora bien, hay otras alternativas que quizá pudieras evaluar. Si cada cliente va a estar generando fotos y que éstas estén disponibles en los otros equipos una posibilidad es aprovechar es la sincronización de archivos, de esa forma todos tendrán las fotos en sus propios equipos. BitTorrent Sync es una buena herramienta en este sentido. Un cambio en un archivo luego se ve reflejado en el resto de los equipos a los que estén sincronizados. Es bastante rápido, sobre todo en una misma red y si es LAN mucho mejor. Un defecto: un borrado, y todos se ven afectados, por lo que eventualmente quizá debieras de considerar un respaldo.

La otra: servicios en la nube.

 

Pero a mi ver los respaldos son necesarios. Guste o no.

 

Saludos,


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 febrero 2017 - 11:45

Pues muchas gracias Delphius, tal como me explicas veo que no me es necesario otra BD, y aunque vi en FirebirdSQL (Creo), que sí se puede hacer consultas entre dos BD, sólo que es bastante complejo la implementación, lo que haré es crear una tabla para las imágenes, así hago la consulta cuando se requiera y evito problemas de eficiencias en SELECT's.


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 febrero 2017 - 12:22

Pues muchas gracias Delphius, tal como me explicas veo que no me es necesario otra BD, y aunque vi en FirebirdSQL (Creo), que sí se puede hacer consultas entre dos BD, sólo que es bastante complejo la implementación, lo que haré es crear una tabla para las imágenes, así hago la consulta cuando se requiera y evito problemas de eficiencias en SELECT's.

 

Es cierto que se puede realizar consultas externas. Pero no recuerdo si es desde FB 2.1 o 2.5. Y a pesar de que se puede... la forma de hacerlo quizá no es la más "directa" y sana en comparación a otros motores. Que yo recuerde, se debe hacer mediante la instrucción EXECUTE STATEMENT.

Distinto es en FB 3.0, que incluye (o mejor dicho, incluirá) soporte para consultas externas de forma natural al mismo estilo que otros motores. Es decir, se podrá hacer un SELECT mezclando varias bases de datos por ejemplo y sin tener que usar un EXECUTE STATEMENT.

 

Eso de si es necesario o no es relativo, hay varios factores a considerar... El tema de si poner las fotos o cualquier otro material en una DB es un debate abierto y que nunca va a terminar. Vas a encontrar posturas desde ambos lados. Lo hemos discutido unas cuantas veces en el foro, y como verás, llegamos a la frase de Eliseo: Depende, depende, depende.

 

Y como dije, Firebird almacena los blobs separados del resto de los otros campos. Esto es justamente por asuntos de eficiencia. No hace falta una tabla separada per se para ellos, aunque si tu diseño lo amerita, hazlo.

 

Saludos,


  • 0




IP.Board spam blocked by CleanTalk.