[Pgsql-ayuda] Dato para =?iso-8859-1?Q?im=E1genes?=

Maigualida =?iso-8859-1?Q?Mart=EDnez?= maix25@yahoo.es
Thu, 06 Sep 2001 16:19:17 -0400


Ricardo:
    Encontre esta explicacion a tu duda, espero te sirva, aunque yo no lo he
probado, confio en la sabiduria de Ernesto :=):

> Otro punto: Quiero almacenar archivos *.jpg de varios centenares de kbyte
> cada uno en una base de datos Postgres. Qual sera el tipo de data mas
> apropiado; quizas "varchar" ?

Para almacenar archivos binarios en general (imágenes, audio, video)
en una base de datos es sumamente ineficiente emplear columnas CHAR,
VARCHAR o TEXT, pues todas están sujetas a interpretaciones derivadas
de considerar a lo que almacenan como "legible" o "no binario". Los
objetos binarios grandes se denominan BLOBs (por Binary Large OBjects,
muy original :-) y se almacenan de forma especial en PostgreSQL y en
cualquier otra base de datos relacional decente.

Los BLOBs se almacenan empleando _referencias_. En la tabla colocas
una columna de tipo 'oid' (Object IDentifier) y empleas rutinas especiales
provistas por PostgreSQL para alimentar el objeto; el manejador almacena
el objeto donde le parece mejor, en espacio contigüo y _fuera_ de la
tabla, colocando un apuntador a dicho espacio dentro de la tabla. De ese
modo, los objetos grandes no se convierten en una molestia para el
manejo relacional (como ocurre en Oracle y en el manejador de archivos
con SQL conocido como MySQL) y es mucho más eficiente manejar
transacciones.

Por ejemplo,

create table music (
  name varchar(30),
  mp3  oid
);

insert into music
values ( 'Marillion - Tux On', lo_import('/tmp/marillion-tux-on.mp3') );

select lo_export(music.mp3, '/tmp/t.mp3')
from music where name = 'Marillion - Tux On';

Tanto el módulo Pg como el módulo DBD::Pg, ambos para Perl, tienen
encapsuladas las funciones lo_import y lo_export para poder utilizarlas
en tus aplicaciones. Revisa man Pg, man DBD::Pg para los detalles.

Como notas interesantes de comparación, Oracle solamente permite _una_
columna BLOB por tabla y almacena el objeto _con_ la tabla; es nausaeabundo
lo que ocurre cuando hay transacciones porque los BLOBs van a parar al
log de transacciones consumiendo espacio de forma obscena. Con Informix se
pueden tener varias columnas BLOB en la tabla o explícitamente en un espacio
destinado para BLOBs y cuyo tamaño de página está optimizado según el
administrador crea necesario; cuando se usan referencias, los BLOBs no se
copian en el log de transacciones. PostgreSQL permite tener todos los
BLOBs por tabla que se necesiten, siempre usa apuntadores, almacena los
objetos empleando espacio contigüo sin necesidad de describir el tamaño
de página pero exige que todos los accesos (incluso SELECT) sean hechos
en una transacción.
--
Ernesto Hernández-Novich -

Ricardo Arratia Joglar wrote:

> ¿Alguien sabe que tipo de datos se usa en postgre para almacenar imágenes en
> el motor?
> Soy nuevo en Postgre y quisiera si alguien me puede responder.
> Gracias
>
> _______________________________________________
>

Maigualida. :=)