Re: OT: mejores practicas

From: Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>
To: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
Cc: Foro PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: OT: mejores practicas
Date: 2009-03-20 15:31:40
Message-ID: 3073cc9b0903200831t46f2f80an89b27dc7e0304817@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2009/3/19 Miguel Beltran R. <yourpadre(at)gmail(dot)com>:
> Platicando con un amigo sobre como es mejor diseñar una base de datos
> tenemos un punto de desacuerdo.
>
> Yo digo que siguiendo la normalización en ocaciones puede ser un problema
> creo (ó es un mal diseño mio tal vez).
>

esto no parece muy normalizado que digamos...

> Por ejemplo siguiendo la normalización (la estructura es solo para dar una
> idea):
> tablaA {
> id  serial;
> proyectoA  integer PRIMARY KEY;
> proyectoA_nombre  text;
> anio  integer;
> }
>

para que el "id serial"? todas las tablas tienen uno y me parece que
no sirve a ningun proposito util...

> tablaB {
> id serial;
> proyectoA integer reference tablaA (proyectoA)
> proyectoB integer PRIMARY KEY
> fecha  date;
> fondo  varchar(10);
> cuenta varchar(10);
> }
>

si tabla B depende directamente de tabla entonces proyectoA deberia
formar parte del PK, por ejemplo si tabla B almacena algun tipo de
detalle (como en el caso de la factura y el detalle de la factura)
pero sin saber que tipo de informacion se va a almacenar solo son
conjeturas

> tablaC {
> id serial;
> anio integer; --es el mismo que en tablaA
> proyetoC integer;  --es un consecutivo que empieza
>                            --en 1 cada año, no se debe repetir
>                            --por eso se combina con anio.
> proyectoB integer REFERENCE tablaB (proyectoB);
> }PRIMARY KEY (anio, proyectoC)
>

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

> tablaD {
> id serial;
> tablaC_id integer REFERENCE tablaC (id)
> tipo char(1);
> folio integer;
> }PRIMARY KEY (tipo, folio)
>
>
> El problema que le digo a mi amigo, es que si necesito unos datos de tablaD
> filtrada por anio y proyectoA tengo que hacer muchos INNER JOIN -((tablaA
> inner JOIN tablaB) inner join tablaC) inner join tablaD-, y yo se que me van
> a pedir muchos reportes con esas caracteristicas. Y como estas los costos de
> almacenaje no representa mucho el gasto espacio de disco duro y si mas
> rapides si guardo esos 2 campos (ejercicio y proyectoA) en la tablaD.
>

haz los cambios que te digo y me cuentas...

> ¿quién tiene rázon? ¿cómo sería lo mas rapido/mejor.?
>

lo mas rapido no siempre es lo mejor y viceversa... mejor es hacerlo
primero bien y luego preocuparse de que responda rapido... despues de
todo, "la optimizacion prematura es la raiz de todos los males" (no
recuerdo quien lo dijo)...

--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. +59387171157

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Terry Yapt 2009-03-20 15:44:40 Transformación valor columna 'BEFORE INSERT' común...
Previous Message Alvaro Herrera 2009-03-20 15:29:06 Re: Nombre de parametros en funciones.