[Pgsql-ayuda] Herencia

Alvaro Herrera alvherre@dcc.uchile.cl
Fri, 9 Jan 2004 12:44:43 -0300


On Thu, Jan 08, 2004 at 05:55:28PM -0600, Roberto Andrade Fonseca wrote:

> 1) Usar la herencia de Pg.
> 
>  create table contacto(nombre text, direccion text);
>  create table abogado(casos int) inherits (contacto);

El problema con esto es que si tienes

create table ingeniero (...) inherits (contacto)

puede haber ingenieros y abogados que violen restricciones UNIQUE
aplicadas a la tabla contactos (caso tipico: id SERIAL PRIMARY KEY)
Esto sucede porque la infraestructura de indice no puede usar mas de una
tabla.  (En realidad no es necesario que haya ingenieros para esto --
los abogados pueden hacerlo por si solo, si hay registros en la tabla
contacto _y_ en la tabla abogados)

Esto puede ser resuelto usando una tabla auxiliar que contenga los IDs
de todas las tablas de la jerarquia de herencia, y una restriccion
UNIQUE.

Otro problema es el de las llaves foraneas que hagan referencia a
contacto.  No veran a nadie que este en abogados.  Puedes usar la misma
tabla auxiliar con IDs para solucionar esto.

Quizas hay mas ...

>  create table contacto(nombre text, direccion text, id int);
>  create table abogado_detalle(id int references(contacto), casos int);
>  create view abogado as select c.nombre, c.direccion, a.casos from
> contacto c, abogado a where c.id=a.id
> 
> y alguna regla  para los inserts y los updates.

No parece mala idea ...

> (¿Se nota que no me se la sintaxis para las vistas?)

No.


> Lo malo de 2) es que o pierdo el uso de la herramienta, o tengo que
> modificarla. Lo malo de 1) es que pierdo portabilidad. Estoy tentado a
> irme por 1), pero necesito saber si hay alguna otra cosa que tomar en cuenta.

No se que tan no-portable sea 1) (hay alguna otra DB que soporte
herencia?) pero si no te preocupa mucho es porque ya compraste la idea
de usar Postgres :-)  Ninguna de las dos parece realmente mala, salvo
por el defecto de Postgres que menciono mas arriba.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
Voy a acabar con todos los humanos / con los humanos yo acabaré
voy a acabar con todos / con todos los humanos acabaré (Bender)