[pgsql-ayuda] Relacionar tablas

Luis Rodrigo Gallardo Cruz <Rodrigo Gallardo lrgallardo@abl.com.mx
Mon, 26 Mar 2001 19:26:07 -0600


No revise demasiado bien la situación, pero en primera intención, me
parece que el acercamiento que tuviste primero, usar varias tablas y
llaves foraneas, es el más adecuado. La herencia tiene entre otros
problemas el que se dificulta que tengas un estudiante que tambien es
empleado, por que entonces estaría enlistado varias veces.

Para más referencia:

Creas una tabla persona.
Creas estudiante inherits from persona.
Creas empleado inherits from persona.

¿Quieres una lista de estudiantes? Haces select * from estudiantes.
¿Quieres una lista de empleados? Haces select * from empleados.

Pero que pasa si quieres la lisa combinada. Tienes que hacer 
select * from persona*   <--- nota el asterisco
que selecciona de persona y todas sus tablas derivadas.

Pero así no hay manera de evitar duplicados si hay un estudiante que
también es empleado. A menos de que uses como identificador el id en
persona.

Pero entonces tienes que insertar en empleado *y* es persona cuando
tengas uno nuevo, para mantener el id. O sea que de cualquier forma
estás usando llaves foraneas.

O no guardas nada en persona, y mantienes una secuencia compartida
entre estudiante y empleado que te de el id.

Pero entonces, ¿que es la tabla personas? Si no guarda nada, ¿para que
la quieres? Pareciera que solo es la definición de un nuevo tipo de
datos, el dato persona, del que tanto estudiante como empleado guardan
instancias. ¿Y como se si un estudiante y un empleado son la misma
persona? Estas son algunas de las objeciones teoricas que tiene la
implementación actual de objetos en PostgreSQL (y parece que en todas
las bases de datos que lo implementan). Cuando yo empezé a usar
PostgreSQL, también me pareció muy interesante esto de la herencia,
sin embargo me comenzé a dar cuenta de los problemas en un curso que
yo y Roberto dimos acerca de PostgreSQL. Lo digo de nuevo: Este modelo
de objetos está *mal* pensado, por que confunde dos conceptos: el de
relación y el de dominio. Una relación *no* puede ser un tipo de
datos, por que una relación es un *conjunto de n-adas*. Y como no es
un tipo de datos, no puede guardarse en un renglon de otra tabla, ni
tener tipos derivados. En el caso en particular de tu problema, aunque
es cierto que un estudiante es una persona, una sola persona puede ser
varios estudiantes, un empleado, un proveedor y varias cosas más. No
es una caracteristica intrinseca de una persona, y no lo hace
pertenecer a otro tipo de datos. Piensalo en C++, o en Java (y no digo
que en estos lenguajes este implementado sin fallas), ¿Sería adecuado
tener un tipo

class person { bla, bla }

y tipos

class estudiante { ... } extends person
class empleado { ... } extends person
class proveedor { ... } extends person

? ¿Como le harias para tener un estudiante que tambien es empleado en
este caso?

Ojalá esto sea útil, y ojalá hayas leido todo este choro completo.

-- 
Rodrigo


--------- Pie de mensaje -------------------------------------------
Archivo historico: http://tlali.iztacala.unam.mx/maillist/pgsql-ayuda
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : unsubscribe pgsql-ayuda