RE: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Diseño con herencia de tablas

From: "Xavier Vidal" <xvpxvp(at)menta(dot)net>
To: "'Mauricio Zea (Gmail)'" <jmzlbqcol(at)gmail(dot)com>
Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Diseño con herencia de tablas
Date: 2005-05-23 19:43:23
Message-ID: 20050523194319.ZMGN1140.smtp05.retemail.es@pentium4
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

> -----Mensaje original-----
> De: pgsql-es-ayuda-owner(at)postgresql(dot)org
> [mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de
> Mauricio Zea (Gmail)
> Enviado el: lunes, 23 de mayo de 2005 21:26
> Para: Xavier Vidal
> CC: pgsql-es-ayuda(at)postgresql(dot)org
> Asunto: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] RE:
> [pgsql-es-ayuda] Diseño con herencia de tablas
>
> Las vistas nunca hacen perder la gracia de una herencia, al
> contrario facilita inmensamente el trabajo cuando se trata de
> relaciones entre muchas tablas.

Estoy de acuerdo. Sin embargo, he probado de hacerlo con vistas y tampoco ha
funcionado. He creado una vista "create view TODOS as SELECT * FROM A", pero
la foreign key de Contratos no se puede crear ya que PostgreSQL se queja de
que no se pueden relacionar FK con vistas, sólo con tablas.

>
> En tu caso, si haces select a la tabla clientes, no te traerá
> toda la información relacionada con cada cliente en las
> tablas empresas, personas y contratos. Para esto debes hacer
> un Join entre las tablas.

Si, eso lo solucionaba con un LEFT OUTER JOIN.

> Si al insertar un campo en la tabla contratos, se queja
> postgres, es sencillamente por que primero debes tener los
> datos del cliente para poder insertar un contrato. SQL Básico.

Lo del SQL Básico ya hace tiempo que lo he pasado, je je. Lo que digo yo es
que se queja porque, aunque el registro existe en CLIENTES, la foreign key
no lo encuentra porque no está en la tabla "padre" (aunque se pueda
recuperar con JOINS o con VISTAS y SELECTS).

> Espero haberte podido dar una idea, al menos eso fué lo que
> entendí en tu email.
>
> Mauricio Zea

Gracias por la ayuda. Sin embargo, acabo de ver en la documentación de
PostgreSQL (estaba al final del tema de herencia) que las tablas heredadas
sólo heredan campos y secuencias, pero no índices ni la capacidad de ser
relacionadas externamente. Lástima, me han tumbado un buen diseño que tenia
en UML. Ahora solo será cuestión de elegir la chapuza que provoque menos
daño ;)

>
> ----- Original Message -----
> From: "Xavier Vidal" <xvpxvp(at)menta(dot)net>
> To: "'Jaime Casanova'" <systemguards(at)gmail(dot)com>
> Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
> Sent: Monday, May 23, 2005 11:54 AM
> Subject: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Diseño con
> herencia de tablas
>
>
> Buenas
>
> Me voy a explicar mejor con un ejemplo
>
> Tengo una tabla que la llamo clientes, de la cual hago
> heredar dos tablas :
> Personas y Empresas
>
> Los campos quedan así :
>
> Clientes (id, nombre, direccion, e-mail,...)
> Personas (fecha_nacimiento, cargo,...)
> Empresas (capital_social, sector,...)
>
> Ahora, hay una tabla llamada Contratos que tiene una relación
> n a 1 respecto
> a clientes.
>
> Contratos (idcontrato, idcliente, fecha_contrato) donde
> idcliente es foreign
> key a clientes
>
> Este modelo de datos representa a los contratos que tienen
> los clientes, ya
> sean estos personas o empresas, de ahí que se cree la
> herencia de tablas.
>
>
> Clientes -1------n- Contratos
> |
> |
> ----------------
> | |
> Personas Empresas
>
>
> Bien, ahora veamos lo que tienen las tablas:
>
> Personas tiene los registros con id 4,6,8
> Empresas tiene los registros con id 1,2,3,5,7
>
> Ahora si creo un contrato con estos valores (3, 2,10/10/2004)
> , PostgreSQL
> se queja ya que no encuentra a ningún registro de la tabla
> Clientes con el
> id=2, sin embargo Empresas aunque pertenece a Clientes, si
> que tiene el id
> 2, pero no lo sabe relacionar!!!
>
> Lo que no entiendo es que si hago Select * from clientes,
> aparecen todos los
> registros de clientes + personas + empresas
>
> (para que solo salgan los de clientes haria Select * from
> only clientes).
>
> Se me había ocurrido hacer una vista , pero entonces, se
> pierde la gracia de
> la herencia, no?
>
> Gracias.
>
> -----Mensaje original-----
> De: pgsql-es-ayuda-owner(at)postgresql(dot)org
> [mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de
> Jaime Casanova
> Enviado el: lunes, 23 de mayo de 2005 18:22
> Para: Xavier Vidal
> CC: pgsql-es-ayuda(at)postgresql(dot)org
> Asunto: Re: [pgsql-es-ayuda] Diseño con herencia de tablas
>
> On 5/23/05, Xavier Vidal <xvpxvp(at)menta(dot)net> wrote:
> >
> > Saludos.
> >
> > Me he encontrado con este problema, a ver si alguien me
> echa una mano
> > o me da alguna idea:
> >
> > Estoy diseñando una estructura de tablas donde la tabla B y
> C heredan
> > de una tabla A. En las tres tablas tengo registros.
> >
> > A -------- X
> > |
> > ------
> > | |
> > B C
> >
> > A(id, nombre)
> > B(cargo)
> > C(departamento)
> >
> > X(idX, idA, precio)
> >
> > [idA es Foreign Key a "id" de A)
> >
> > Externamente a dicha estructura, tengo una tabla X de la cual tengo
> > una Foreign Key a la tabla A.
> >
> > Conceptualmente, los registros de B y C son también de tipo
> A, pero lo
> > que pasa realmente es que cuando quiero que un registro de
> X apunte a
> > un registro que pertenece a la estructura (en B o C pero no en A),
> > como no está en A me aparece la violación de la integridad
> referencial.
> >
> > No se si me he explicado suficientemente bien, pero bueno.
> Aquí lo dejo.
> > Gracias.
> >
> Solucion rapida, elimina el FK.
>
> Ahora, no entiendo ese tipo de herencia en que pueden haber
> registros en B y
> C que no esten en A. Puede ocurrir, AFAIK, que en A haya
> cosas que no esten
> ni en B ni en C pero no a la inversa. me equivoco?
>
> --
> Atentamente,
> Jaime Casanova
> (DBA: DataBase Aniquilator ;)
>
> ---------------------------(fin del
> mensaje)---------------------------
> TIP 1: para suscribirte y desuscribirte, escribe a
> majordomo(at)postgresql(dot)org
>
>
> ---------------------------(fin del
> mensaje)---------------------------
> TIP 3: si publicas/lees desde Usenet, por favor envía
> "subscribe-nomail"
> a majordomo(at)postgresql(dot)org para que tus mensajes puedan llegar
> a los suscriptores de la lista
>
>
> ---------------------------(fin del
> mensaje)---------------------------
> TIP 3: si publicas/lees desde Usenet, por favor envía
> "subscribe-nomail"
> a majordomo(at)postgresql(dot)org para que tus mensajes puedan llegar
> a los suscriptores de la lista
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2005-05-23 20:05:16 Re: Importar datos desde excel
Previous Message Mauricio Zea (Gmail) 2005-05-23 19:26:19 Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Diseño con herencia de tablas