problema de diseño de multiples fk

From: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
To: "Foro PostgreSQL" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: problema de diseño de multiples fk
Date: 2009-01-09 03:35:40
Message-ID: b623c7e40901081935y1a1b6e76ra5ac5c49242df232@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Pregunta a la lista si me pueden ayudar a saber si postgresql soporta lo que
quiero o tengo que cambiar mi diseño de tabla.

Tengo 3 tablas con casi los mismo campos: contrato, (recurso) humano,
(recurso) material. En estas guardo los recursos con los que voy a contar en
el año, donde tengo el _fondo_ de donde tomo dinero, el _monto_ y las
quincenas inicial y final cuando se va a gastar/recibir el dinero.

En contrato tengo que el _monto_ se debe dividir en partes iguales el rango
de quincenas que ponga. lo normal es de la 1 (1ra de enera) a la 24 (2da de
diciembre). Si el monto es $120,000 entonces cada quincena debe ser de
$5,000.
En humano es igual que en contrato.
En material cambia, porque debo indicar la cantidad en cada quincena que
puede ser diferente, pero al final la suma debe ser igual al _monto_.

Yo queria tener una sola tabla _quincena_ donde guardar los datos de las
otras 3 tablas y que solo tubiera un campo que indicara a donde hacia
referencia, pero ya que lo pense creo que no se puede. Es decir que la tabla
quincena tuviera 3 llaves foraneas del mismo campo de identificador a cada
tabla pero no se puede hacer eso.

Ahora ya pensadolo un poco mejor se me ocurrio tener una tabla principal con
los campos comunes y mis otras 3 tablas que heredaran se la comun y se le
agregue el campo extra a cada una que no tiene que ver con las otras tablas.
este campo tiene una llave foranea a otra tabla. Y ya con esto ahora si la
tabla _quincena_ que tendria su llave foranea a la comun.

La pregunta es que como nunca he trabajado con herencia ¿se puede hacer lo
que quiero? Quiero que en la tabla comun se guarden todos los datos para que
la de quincena este referenciada a la comun.

[diseño actual]
Contrato--------------v
Humano---------> QUINCENA
Materia----------------^

[diseño nuevo]
Contrato Humano Materia
| | |
|>----------------|--------------<|
|
V
Comun
|
V
Quincena

Uso la version 8.3.4

Gracias de antemano y ojala si me puedan ayudar a ver la solución mejor a mi
problema.

CREATE TABLE contrato
(
id serial NOT NULL,
contrato character varying(10) NOT NULL,
contrato_nombre character varying(200) NOT NULL,
fondo character varying(10) NOT NULL,
monto numeric(12,2) NOT NULL,
usado numeric(12,2) NOT NULL DEFAULT 0,
inicial integer NOT NULL,
final integer NOT NULL,
actividad character varying(10) NOT NULL,
CONSTRAINT pk_contrato PRIMARY KEY (contrato),
CONSTRAINT fk_contrato_actividad FOREIGN KEY (actividad)
REFERENCES actividad (actividad) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_contrato_fondo FOREIGN KEY (fondo)
REFERENCES fondo (fondo) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ck_contrato_inicial_final CHECK (inicial >= 1 AND final <= 24
AND inicial <= final)
)

CREATE TABLE humano
(
id serial NOT NULL,
captura time with time zone NOT NULL DEFAULT now(),
humano character varying(10) NOT NULL,
humano_nombre character varying(200) NOT NULL,
categoria character varying(10) NOT NULL,
fondo character varying(10) NOT NULL,
porcentaje integer NOT NULL DEFAULT 0,
actividad character varying(10) NOT NULL,
monto numeric(12,2) NOT NULL,
usado numeric(12,2) NOT NULL DEFAULT 0,
inicial integer NOT NULL,
final integer NOT NULL,
CONSTRAINT pk_humano PRIMARY KEY (humano),
CONSTRAINT fk_humano_actividad FOREIGN KEY (actividad)
REFERENCES actividad (actividad) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_humano_categoria FOREIGN KEY (categoria)
REFERENCES categoria (categoria) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_humano_fondo FOREIGN KEY (fondo)
REFERENCES fondo (fondo) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

CREATE TABLE material
(
id serial NOT NULL,
captura time with time zone NOT NULL DEFAULT now(),
material character varying(10) NOT NULL,
material_nombre character varying(200) NOT NULL,
cuenta character varying(10) NOT NULL,
fondo character varying(10) NOT NULL,
monto numeric(12,2) NOT NULL,
usado numeric(12,2) NOT NULL DEFAULT 0,
actividad character varying(10) NOT NULL,
inicial integer NOT NULL,
final integer NOT NULL,
CONSTRAINT pk_material PRIMARY KEY (material),
CONSTRAINT fk_material_actividad FOREIGN KEY (actividad)
REFERENCES actividad (actividad) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_material_cuenta FOREIGN KEY (cuenta)
REFERENCES cuenta (cuenta) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_material_fondo FOREIGN KEY (fondo)
REFERENCES fondo (fondo) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

CREATE TABLE fondo
(
id integer NOT NULL DEFAULT nextval('fondo_id_seq1'::regclass),
nombre character varying(200) NOT NULL,
fondo character varying(10) NOT NULL,
desde integer NOT NULL,
hasta integer NOT NULL,
CONSTRAINT pk_fondo PRIMARY KEY (fondo)
)

CREATE TABLE categoria
(
id serial NOT NULL,
categoria character varying(10) NOT NULL,
categoria_nombre character varying(200) NOT NULL,
desde integer NOT NULL,
hasta integer NOT NULL,
CONSTRAINT pk_categoria PRIMARY KEY (categoria)
)

CREATE TABLE cuenta
(
id serial NOT NULL,
cuenta character varying(10) NOT NULL,
cuenta_nombre character varying(200) NOT NULL,
desde integer NOT NULL DEFAULT 2008,
hasta integer NOT NULL DEFAULT 2009,
predecesor integer NOT NULL,
CONSTRAINT pk_cuenta PRIMARY KEY (cuenta)
)

--
________________________________________
Lo bueno de vivir un dia mas
es saber que nos queda un dia menos de vida

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ernesto Quiñones 2009-01-09 03:51:33 Generando un dump de postgresql desde P4A
Previous Message inf200476 2009-01-09 03:03:35 Manual de PL/pgSQL