Re: OT: mejores practicas

From: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>, Foro PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: OT: mejores practicas
Date: 2009-03-26 04:06:04
Message-ID: b623c7e40903252106j70f88b90v2e13a4fe2dd7650d@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

>
>
> > > si el anio es el mismo que en tabla A no deberia estar aqui, mas bien
> > > aqui deberia estar el codigo del registro de tablaA lo que me hace que
> > > pensar que mi suposicion de que proyectoA deberia formar parte del PK
> > > de tablaB es correcta
> >
> > Es el mismo, pero esta el anio para no tener que buscar el dato en la
> > tablaA.
>
> Es mala idea. Te recomiendo quitarlo, y una vez que la aplicación esté
> más avanzada, medir qué optimizaciones realmente necesitas. Lo más
> probable es que la desnormalización que te llegue a hacer falta (si es
> que alguna) sea totalmente distinto de lo que te imaginas al principio.
>
> > Una ultima duda con la rapidez, igual y por eso estoy mal con mis
> diseños.
> > Si hago una vista de tablaC que jale el dato de tablaA para tomar el
> anio,
> > cuanta carga se para la base. claro que usario indices.
>
> Diseña normalizado. Una vez que esté listo, desnormalizas sólo allí
> donde sea realmente necesario. De lo contrario es mucho más difícil
> mantener todo.
>
>
Ya normalize todo según yo. Pero llegue a un punto que no se como seguir
aplicando, en la tabla "vale" tengo el campo "ejercicio_id" que tiene que
ser el mismo que en la tabla "proyecto". Tiene que estar porque la PK es
"ejericio_id, vale". vale es un campo númerico que empieza de 1 en cada
ejercicio.

Ya cambie todo a lo siguiente. Nota: los campos tipo serial tienen un INDEX
UNIQUE.

CREATE TABLE proyecto
(
proyecto_id serial NOT NULL,
proyecto character varying(10) NOT NULL,
monto numeric(15,2) NOT NULL DEFAULT 0,
usado numeric(15,2) NOT NULL DEFAULT 0,
ures_id integer NOT NULL,
eje_id integer NOT NULL,
objetivo_pdi_id integer NOT NULL,
estrategia_pdi_id integer NOT NULL,
tipo_proyecto_id integer NOT NULL,
programa_id integer NOT NULL,
proyecto_nombre character(120) NOT NULL,
justificacion text NOT NULL,
objetivo_general text NOT NULL,
inicio date NOT NULL,
fin date NOT NULL,
ejercicio_id integer NOT NULL,
CONSTRAINT pk_proyecto PRIMARY KEY (ejercicio_id, proyecto),
CONSTRAINT fk_proyecto_eje FOREIGN KEY (eje_id)
REFERENCES eje (eje_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_proyecto_ejercicio FOREIGN KEY (ejercicio_id)
REFERENCES ejercicio (ejercicio_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_proyecto_estrategia_pdi FOREIGN KEY (estrategia_pdi_id)
REFERENCES estrategia_pdi (estrategia_pdi_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_proyecto_objetivo_pdi FOREIGN KEY (objetivo_pdi_id)
REFERENCES objetivo_pdi (objetivo_pdi_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_proyecto_programa FOREIGN KEY (programa_id)
REFERENCES programa (programa_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_proyecto_tipoproyecto FOREIGN KEY (tipo_proyecto_id)
REFERENCES tipo_proyecto (tipo_proyecto_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_proyecto_ures FOREIGN KEY (ures_id)
REFERENCES ures (ures_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION
)

CREATE TABLE objetivo
(
objetivo_id serial NOT NULL,
proyecto_id integer NOT NULL,
objetivo character varying(10) NOT NULL,
proyecto_objetivo_nombre text NOT NULL,
CONSTRAINT pk_objeivo PRIMARY KEY (proyecto_id, objetivo),
CONSTRAINT fk_objetivo_pyoyecto FOREIGN KEY (proyecto_id)
REFERENCES proyecto (proyecto_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

CREATE TABLE meta
(
meta_id serial NOT NULL,
meta character varying(10) NOT NULL,
meta_nombre character varying(200) NOT NULL,
indicador character varying(100) NOT NULL,
plan_id integer NOT NULL,
objetivo_id integer NOT NULL,
CONSTRAINT pk_meta PRIMARY KEY (objetivo_id, meta),
CONSTRAINT fk_meta_objetivo FOREIGN KEY (objetivo_id)
REFERENCES objetivo (objetivo_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_meta_plan FOREIGN KEY (plan_id)
REFERENCES plan (plan_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION
)

CREATE TABLE actividad
(
actividad_id serial NOT NULL,
actividad character varying(10) NOT NULL,
actividad_nombre text NOT NULL,
inicio date NOT NULL,
fin date NOT NULL,
monto numeric(15,2) NOT NULL,
reservado numeric(15,2) NOT NULL DEFAULT 0,
meta_id integer NOT NULL,
usado numeric(15,2) NOT NULL DEFAULT 0,
CONSTRAINT pk_actividad_meta_actividad PRIMARY KEY (meta_id, actividad),
CONSTRAINT fk_actividad_meta FOREIGN KEY (meta_id)
REFERENCES meta (meta_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT ck_actividad_reservado CHECK (reservado <= monto),
CONSTRAINT ck_actividad_usado CHECK (usado <= reservado)
)

CREATE TABLE material
(
material_id serial NOT NULL,
actividad_id integer NOT NULL,
captura time without time zone NOT NULL DEFAULT now(),
material character varying(10) NOT NULL,
material_nombre character varying(200) NOT NULL,
fondo_id integer NOT NULL,
cuenta_id integer NOT NULL,
monto numeric(15,2) NOT NULL,
usado numeric(15,2) NOT NULL DEFAULT 0,
recibido numeric(15,2) NOT NULL DEFAULT 0,
reservado numeric(15,2) NOT NULL DEFAULT 0,
CONSTRAINT pk_material PRIMARY KEY (actividad_id, material),
CONSTRAINT fk_material_actividad FOREIGN KEY (actividad_id)
REFERENCES actividad (actividad_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_material_cuenta FOREIGN KEY (cuenta_id)
REFERENCES cuenta (cuenta_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_material_fondo FOREIGN KEY (fondo_id)
REFERENCES fondo (fondo_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT ck_material_recibido CHECK (recibido <= reservado),
CONSTRAINT ck_material_reservado CHECK (reservado <= monto),
CONSTRAINT ck_material_usado CHECK (usado <= recibido)
)

CREATE TABLE vale
(
vale_id serial NOT NULL,
material_id integer NOT NULL,
captura time with time zone NOT NULL DEFAULT now(),
fecha date NOT NULL,
vale integer NOT NULL,
concepto text NOT NULL,
xprograma character varying(5) NOT NULL DEFAULT 7.1,
xsubprograma character varying(5) NOT NULL DEFAULT 4.1,
importe numeric(12,2) NOT NULL,
conletra character varying(200) NOT NULL,
responsable character varying(200) NOT NULL,
favor character varying(250) NOT NULL,
condicion integer NOT NULL DEFAULT 1, -- 0: Cancelado...
ejercicio_id integer NOT NULL,
CONSTRAINT pk_vale PRIMARY KEY (ejercicio_id, vale),
CONSTRAINT fk_vale_ejercicio FOREIGN KEY (ejercicio_id)
REFERENCES ejercicio (ejercicio_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT fk_vale_material FOREIGN KEY (material_id)
REFERENCES material (material_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT ck_vale_concepto_trim CHECK (btrim(concepto) <> ''::text),
CONSTRAINT ck_vale_condicion CHECK (condicion >= 0 AND condicion <= 9),
CONSTRAINT ck_vale_conletra_trim CHECK (btrim(conletra::text) <>
''::text),
CONSTRAINT ck_vale_favor_trim CHECK (btrim(favor::text) <> ''::text),
CONSTRAINT ck_vale_responsable_trim CHECK (btrim(responsable::text) <>
''::text)
)

CREATE TABLE transaccion
(
transaccion_id serial NOT NULL,
captura timestamp(3) without time zone NOT NULL DEFAULT now(),
modificado timestamp(3) without time zone NOT NULL DEFAULT now(),
tipo character(1) NOT NULL,
folio integer NOT NULL,
fecha date NOT NULL,
conletra character varying(254) NOT NULL,
importe numeric(12,2) NOT NULL,
favor character varying(254) NOT NULL,
observacion text NOT NULL,
concepto character varying(200) NOT NULL,
vale_id integer NOT NULL,
referencia1 character varying(40) NOT NULL DEFAULT ''::character varying,
referencia2 character varying(40) NOT NULL DEFAULT ''::character varying,
condicion integer NOT NULL DEFAULT 1, -- 0: Cancelado...
CONSTRAINT pk_che_tra PRIMARY KEY (tipo, folio),
CONSTRAINT fk_che_tra_vale FOREIGN KEY (vale_id)
REFERENCES vale (vale_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT ck_che_tra_condicion CHECK (condicion = 1 OR condicion = 0),
CONSTRAINT ck_che_tra_tipo CHECK (tipo = 'C'::bpchar OR tipo =
'T'::bpchar)
)

Me falta hacer otra tabla que tambien depende de vale.

Alvaro, Jaime, o alguien más ¿cómo esta ahora la tabla?¿alguna sugerencia
sobre cómo resolver lo del ejercicio_id en la tabla vale?

Gracias de antemano

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message I.N.T. - Programación 2009-03-26 12:26:58 [Fwd: Re: Codificación de BBDD]
Previous Message Horacio Miranda 2009-03-26 00:25:06 Re: [pgsql-es-ayuda] Codificación de BBDD