[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)