From: | "Guillermo O(dot) Burastero" <linux(dot)gb(at)gmail(dot)com> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Actualizar campo |
Date: | 2005-11-08 12:42:42 |
Message-ID: | 43709D42.5040503@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
xpuig(at)innova7(dot)net escribió:
>Hola,
> No se como debo hacer lo siguiente:
>
>Tengo 3 tablas:
>
>tabla1(usuarios):
>id_t1 (integer) primary key
>nombre (varchar 100)
>num_pedidos (integer)
>
>tabla2(pedidos):
>id_t2 (integer) primary key
>pedidos (varchar 100)
>
>
>tabla3(relación usuarios-pedidos):
>id_1 (integer)
>id_2 (integer)
>
>Me gustaria que el campo tabla1.num_pedidos estuviera actualizado en todo
>momento con el número de pedidos que figurara en la tabla3.
>
>Esto creo que se hace con triggers sobre la tabla3 pero que función debe
>ejecutar?? como creo la función si es así?
>
>gracias de antemano.
>
>---------------------------(fin del mensaje)---------------------------
>TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envíe "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
>
>
>
Si un pedido solo pertenece a un usuario (o cliente como creo entender)
y éste puede tener varios pedidos la relación es de tipo 1 a muchos o
sea Clientes <----- Pedidos, por lo tanto no hace falta la relación que
indicas en tabla3 que normalmente se emplea para convertir una relación
muchos a muchos (difícil de manejar) en dos relaciones muchos a uno y
uno a muchos.
El esquema de realación quedaría así: Clientes (IdCliente,
NombreCliente, xxx, total_pedidos) <----- Pedidos (IdPedido, IdCliente,
pedido, yyy ).
Ahora bien, agregar el campo total_pedidos, es una mála práctica porque
es una información redundante no esencial ya que esa información esta en
la base de datos y se obtiene facilmente, por ejemplo con
SELECT c.IdCliente, COUNT (*) AS Total_pedidos FROM clientes c,
pedidos p WHERE c.IdCliente = p.IdCliente GROUP c.Id_Cliente
que te da sólo los clientes que tienen al menos un pedido, si en cambio
te interesa que te de también los clientes con 0 pedidos hacé un LEFT
JOIN así:
SELECT c.IdCliente, COUNT (p.IdCliente) AS Total_pedidos FROM
clientes c LEFT JOIN pedidos p ON c.IdCliente = p.IdCliente GROUP
c.Id_Cliente
Te aconsejo, antes de hacer el diseño de tu primer esquema de base de
datos relacional que leas algo sobre normalización. Ningúna programación
corrige un mal diseño.
Saludos
--
Guillermo O. Burastero - Linux Counter User 84879, http://counter.li.org
Córdoba 171 - B8000IFC - Bahía Blanca - Buenos Aires - Rep. Argentina
Tel +54 (291) 454-6132 - ICQ 97148268 - email: linux(dot)gb(at)gmail(dot)com
From | Date | Subject | |
---|---|---|---|
Next Message | RRHH Monolabs Consulting | 2005-11-08 13:19:15 | Ofertas de trabajo relacionadas con PostgreSQL |
Previous Message | gonzalo sáenz | 2005-11-08 12:08:44 | Re: Truncado de varchar |