Las columnas de tipo BLOB nos permiten guardar en ellas contenido muy grande: típicamente mayor a 32765 bytes. ¿Por qué ese número? Porque una columna de tipo VARCHAR puede guardar hasta 32765 bytes entonces usaríamos una columna BLOB cuando necesitamos un espacio de almacenamiento mayor.

El contenido de las columnas de tipo VARCHAR puede ser indexado, el contenido de las columnas de tipo BLOB no puede ser indexado.

Entonces, si estamos seguros de que la columna siempre contendrá menos de 32765 bytes lo conveniente es que sea de tipo VARCHAR, para poder indexarla cuando lo deseemos.

Ok, ya estudiamos el caso y decidimos que necesitamos una columna de tipo BLOB, ¿en cuál tabla la guardamos?

Aquí tenemos dos posibilidades:

  1. Guardarla en la misma tabla que los demás datos
  2. Guardarla en una tabla separada

Por ejemplo, tenemos una tabla de EMPLEADOS y queremos guardar las fotografías de los empleados. O tenemos una tabla de VENTAS y queremos guardar las facturas escaneadas.

Si elegimos la posibilidad 1. entonces debemos olvidarnos por completo de escribir algo como SELECT * FROM EMPLEADOS, o como SELECT * FROM VENTAS, porque el tiempo que se demorará en obtener el conjunto resultado puede ser muy grande.

Por el contrario, si elegimos la posibilidad 2. nunca tendremos ese problema ya que la columna BLOB se encuentra en otra tabla y para leer su contenido debemos específicamente escribir un JOIN.

Elegir la posibilidad 1. tiene las ventajas de que nuestros SELECTs son más sencillos de escribir y que usamos menos espacio en el disco duro pero tiene la desventaja de que los resultados se obtienen más lentamente. Y nuestra prioridad siempre debe estar enfocada en conseguir la máxima velocidad posible.

Ejemplo. Guardar las fotografías de los empleados

BLOB1

Captura 1. Si haces clic en la imagen la verás más grande

En la Captura 1. vemos la estructura de la tabla EMPLEADOS.

BLOB2

Captura 2. Si haces clic en la imagen la verás más grande

Y en la Captura 2. vemos la estructura de la tabla EMPLEADOSFOT, que es la tabla donde guardamos las fotografías de los empleados.

Evidentemente al usar dos tablas estamos ocupando más espacio en el disco duro porque tenemos dos columnas (EMF_IDENTI y EMF_IDECAB en nuestro ejemplo) que no necesitaríamos si usáramos una sola tabla.

Al usar dos tablas cuando consultamos a la tabla de EMPLEADOS no recuperamos las fotografías, para recuperarlas debemos escribir un JOIN similar a éste:

SELECT
   E.EMP_IDENTI,
   E.EMP_NOMBRE,
   E.EMP_APELLD,
   F.EMF_FOTOGR
FROM
   EMPLEADOS    E
LEFT JOIN
   EMPLEADOSFOT F
      ON E.EMP_IDENTI = F.EMF_IDECAB

Empleamos la cláusula LEFT JOIN para poder obtener los datos de todos los empleados, inclusive los de aquellos que no tienen fotografías.

Conclusión:

Si necesitas tener columnas de tipo BLOB entonces lo conveniente y lo recomendable es guardarlas en tablas separadas. Relacionarás la tabla padre y la tabla hija con un identificador común para escribir la cláusula JOIN cuando necesites recuperar la columna de tipo BLOB, tal como se vio en el SELECT de arriba.

Si guardas los datos y la columna de tipo BLOB en una sola tabla entonces tus SELECTs serán más sencillos de escribir y ahorrarás espacio en el disco duro. Pero tus consultas serán más lentas.

Y tu prioridad debería ser tener consultas rápidas, ya que en esta época usar unos pocos bytes más no importa.

Artículos relacionados:

Usando columnas de tipo BLOB

El índice del blog Firebird21

 

Anuncios