
Campo Para foto en firebird
#1
Escrito 10 febrero 2010 - 10:16
Utilizo firebird 2.1
Me gustaria saber cual es la mejor opcion para manejar fotos en un formulario. Habia oido o leido que no era bueno poner un campo foto en una tabla porque ralentiza el funcionamiento de la base de datos y hace mas pesadas las consultas.
Preguntas:
-El campo debe ser blob, pero que mas debo hacer para declarar un campo que va a ser usado para fotos.
-Habia leido que habia que crear un campo adicional para guardar el formato de la foto.
-como insertar la foto a la base de datos.
-Deberia crear una tabla independiente solo para fotos y tener una llave foranea o campo llave.
- con que componente debo ver las fotos en mi form y si con el puedo insertar nuevas fotos.
Que debo saber y que no debo hacer para usar correctamente fotos en mi base de datos
gracias de antemano a todos.
#2
Escrito 10 febrero 2010 - 10:36
La decisión de si o no almacenar fotos en una base de datos depende de muchas cosas. No basta con descartarla por el simple hecho de que se hacen más pesado.
La respuesta es un DEPENDE. En ocasiones es bueno, y en otras no.
Naturalmente, cuanto más fotos y más grandes sean más pesado será la base de datos. Y si, puede afectar un poco el rendimiento de las consultas, pero no exageradamente.
Respecto a tus preguntas:
1. No debes hacer demasiado, cuanto mucho podrías indicarle el SUBTYPE.
2. No necesariamente. Firebird solito se encarga de como interpretar adecuadamente el formato. Sólo te podría ser útil este campo cuando en tu aplicativo se emplean diversos formatos y debes aplicar la conversión adecuada.
3. DEPENDE. Deberías analizar objetivamente el diseño de tu base de datos y como están establecidas las relaciones. NO hay una respuesta exacta a esta pregunta.
4. Puedes verlas con el TImage o incluso con el TDBImage (aunque tengo entendido que éste solo funciona con BMPs... no estoy totalmente seguro).
Para guardar y/o leer puedes hacer uso de TStreams, o directamente del campo... depende de como estés llevando la programación. Necesitaríamos más información sobre este punto.
No termino de comprender a que viene la 5ta pregunta. Por favor explícate.
Esto es en forma breve, si es necesario ser más detallista sugiero que a medida que vayas avanzando y tengas las dudas las vayamos tratando.
Saludos,
#3
Escrito 10 febrero 2010 - 11:40
-El campo debe ser blob, pero que mas debo hacer para declarar un campo que va a ser usado para fotos.
Sí, un BLOB es lo adecuado. Pero también podría darte una solución alterna, que te consignaré adelante.
-Habia leido que habia que crear un campo adicional para guardar el formato de la foto.
Nope. Las versiones adelante de Firebird 1.5.4 hacen una maravilla el guardar una imagen o cualquier objeto en un campo de la tabla.
-como insertar la foto a la base de datos.
Con un vil INSERT, como cualquier dato.
-Deberia crear una tabla independiente solo para fotos y tener una llave foranea o campo llave.
Es lo recomendable. Tener tus datos texto y objetos en la misma tabla, baja horrorosamente el rendimiento de las búsquedas.
- con que componente debo ver las fotos en mi form y si con el puedo insertar nuevas fotos.
Con un TImage es más que suficiente. De hecho, es el único que yo te recomendaría.
Ahora, una solución que me dió un PHPero. Guardar en una carpeta especial las imágenes y en cada registro la ruta y nombre de cada imagen. Las búsquedas se agilizan mucho, tu base de datos no crece en exceso, es más manejable y sobre todo, previene que se corrompa el campo que contiene al objeto y termines con un plato de spaghetti de bits donde antes había una foto de Monica Belucci.
#4
Escrito 11 febrero 2010 - 03:36
Por eso tardé mucho en utilizar BLOB's con Firebird, hasta que me di cuenta de que la gente que los recomendaba tenía razón: con Firebird no tienes esos problemas. Los campos BLOB apenas van a tener el menor impacto sobre el rendimiento de la base de datos, y son muy sencillos de utilizar. Así pues te recomiendo que no te compliques y utiliza un campo Blob.
Ni siquiera te recomiendo que crees una tabla independiente, exclusiva para los BLOB's. Puedes poner la imagen directamente en la tabla del cliente/producto/... con el resto de datos. Simplemente acuérdate de que tienes ese campo, y por lo tanto, si vas a mostrar los datos en una grid, no hagas un SELECT * FROM XXX, puesto que estás cargando ese dato para todos los registros, y eso es un desperdicio de tiempo para la consulta y memoria, puesto que no lo muestras. En mi experiencia, si en tu consulta solo recuperas los campos estrictamente necesarios, no vas a notar ninguna diferencia con que la tabla tenga un campo Blob muy grande, o no lo tenga.
Donde vas a encontrar diferencias al utilizar BLOB's es en el tamaño de la base de datos, ahora te va a crecer mucho, puesto que lleva todas las fotos dentro. Así que tienes que elegir, tiene sus ventajas e inconvenientes. INCONVENIENTES : Tardas mucho más en hacer un Backup, copiar la base de datos, ... VENTAJAS : En un Backup de la Base de Datos tienes absolutamente todos tus datos. No hace falta que además hagas copias de una carpeta en el servidor donde tienes tus archivos de fotos, pdf's, etc. ...
Saludos.
#5
Escrito 11 febrero 2010 - 06:45
1.- El campo blob debe ser:
BLOB SUB_TYPE 1 SEGMENT SIZE 100
2, 4.- Todo depende de que quieras lograr, por ejemplo si no te interesa que las imágenes se repitan y es sólo una imagen por registro pues con que tengas un campo en la misma tabla trabaja de manera fenomenal; ahora bien si quieres tener enlazado varias imágenes a un registro pues una tabla adicional te servirá. En cuanto al formato Firebird se maneja bien con esto, creo que todo dependerá el componente.
3.- TBlobField(CAMPO).LoadFromFile es la manera más común, también tienes la indicada por Delphius para cargarlo desde un Stream.
5.- Con un simple Image debería de funcionar correctamente.
#6
Escrito 12 febrero 2010 - 05:44
Gracias de nuevo.