Sábado, 05 de Noviembre de 2005

Trabajando con imágenes en SQL

No me considero un experto en SQL, pero la experiencia es un grado y trabajar con imágenes en SQL debe ser tratado con especial atención.

Los habitual es que creemos una tabla que contenga todos los datos necesarios y, además, una columna que recoja las imágenes, así nos encontraremos con una tabla de artículos de esta forma:

id
barras
descripcion
p_coste
p_venta
foto

Este sistema funciona, no voy a decir que no, pero ocurren dos cosas a tener en cuenta:

  1. Cada vez que hacemos un SELECT * FROM articulo el resultado tarda en llegarnos por el peso de las imágenes.
  2. Cada vez que se intenta obtener un resultado filtrando (WHERE) por una columna no indexada el resultado tarda en llegarnos por que el servidor tiene que recorrer la tabla entera de forma secuencial soportando el peso de las imágenes.

¿Como he solucionado esto? Para los experimentados en SQL será obvio, pero para los que empiezan es un gran descubrimiento ;-). El sistema es sacar las imágenes de las tablas principales y alojarlas en una tabla aparte que contendrá todas las imágenes de la base de datos con independencia de la tabla a la que pertenecen y en la tabla principal cambiar la columna imagen (del tipo blob) por una que contendrá el identificador de la imágen en la tabla de imágenes:

Tabla imagenesTabla articulosTabla clientes
id
imagen
nombre
id
barras
descripcion
p_coste
p_venta
id_foto
id
apellidos
nombre
domicilio
cpostal
localidad
provinvia
telefono
id_foto

id_foto en las tablas de articulos y clientes es una clave foranea que apunta al id de imágenes, estableciendo la relación.

Usando ésta técnica sólo accederemos a las imágenes cuando sea necesario sin hacer que el servidor cargue con su peso cuando no las queramos.

Jose A. Suárez   |  Comentarios [5]

Comentarios

Al igual que sacas las imagenes, yo también saco los textos (los memos), para así no recuperarlos más que cuando son necesarios.

Habitualmente tengo dos tablas para eso:

IMAGENES
id
tabla
id_tabla
titulo
imagen

TEXTOS
id
tabla
id_tabla
titulo
texto

De esa forma tiene un uso genérico, sirve para cualquier tabla y puedo tener N textos o imagenes por tabla.

Una pega: no puedes implementar integridad referencial mediante claves externas, para ello utilizo triggers.

Un saludo.

Comentado por Jose Alberto a Sábado, 05 de Noviembre de 2005

Hola Jose:

Me podrias orientar, como guardar y recuperar una imagen de un campo MySQL, o cuales son tus metodos.

De antemano muchas gracias.

Saludos
Marco A. Delgado.

Comentado por Marco A. Delgado a Miércoles, 09 de Noviembre de 2005

alojar las imagenes en una carpeta y nombrarlas con el mismo id de registro
el nombre se contruye segun el registro &.jpg

facil
mas rapido no tiene que leer tablas con imagenes
solo busca el nombre asociado al registro

Comentado por gustavo a Lunes, 12 de Diciembre de 2005

Gustavo,

¿Y si no puedes tener una carpeta compartida en la red? Por ejemplo, en un servidor remoto.

Saludos

Jose A. Suarez

Comentado por Jose A. Suárez a Martes, 13 de Diciembre de 2005

Marco A.,

Con Eagle 1 3.03 dispones de herramientas para guardar-recuperar imágenes en tablas MySQL. Mirate los ejemplos.

Saludos

Jose A. Suarez

Comentado por Jose A. Suárez a Martes, 13 de Diciembre de 2005