Calabaza escribió:
El día 15 de abril de 2009 10:53, Linos <[email protected]> escribió:
Hola,
       estoy guardando una información en mis tablas de una manera que no me
parece la
mas correcta (pero no se me ocurre ninguna mejor) y ya que es un problema
tan
común y que muchos de vosotros sabéis muchos de bases de datos y
específicamente
de postgresql probablemente me podáis recomendar una solución mejor para
esto.

Se me da en alguna entidad mas pero poniendo por ejemplo albaranes de
salida.

luego de buscar que es "albaranes de salida"
http://www.google.com.py/search?hl=es&q=que+es+albaranes+de+salida&btnG=Buscar+con+Google&meta=

Empiezo a entender tu problema....

yo tengo los clientes separados en sus tablas en función de las necesidades
de
los campos de sus tablas, en este caso tengo 3 tablas de clientes:

-cliente, empresa_cliente y empresa_grupo, los almaceno separados pq sus
columnas no son las mismas.
Podrias mostrar los create table de cada uno por favor?

Creo que deberia quedar algo asi:

Una empresa_grupo posee varias empresa_cliente y esa empresa_cliente
posee varios clientes.
lo que sería en un pseudo diagrama de entidad/relacion:

empresa_grupo 1 ---<poseee>---- N empresa_cliente
empresa_cliente 1 --<posee> ------ N clientes

Pero realmente no se cual sea tu nececidad...

claro cuando voy a hacer un albaran de salida tengo q especificar el tipo de
cliente y el id del cliente en la tabla en cuestión, uso en la tabla de
albaranes de salida los campos "tipo_cliente" e "id_cliente" para guardar
estos
valores.

Cuando quiero hacer una consultar a los albaranes de salida donde muestre el
nombre del cliente tengo que hacer o:

SELECT cab.numero_albaran,
       CASE
          WHEN tipo_cliente = 'CLIENTE' THEN cli.nombre
          WHEN tipo_cliente = 'CLIENTE EMPRESA' THEN  cli_emp.nombre
          WHEN tipo_cliente = 'CLIENTE GRUPO' THEN  cli_grp.nombre
       ELSE NULL
FROM albaran_salida_cabecera AS cab
    LEFT JOIN cliente AS cli ON cli.id_cliente = cab.id_cliente
    LEFT JOIN cliente_empresa AS cli_emp ON cli_emp.id_cliente =
cab.id_cliente
    LEFT JOIN empresa_grupo AS cli_grp ON cli_grp.id_cliente =
cab.id_cliente;

o esto:

SELECT cab.numero_albaran,
      cli.nombre
FROM albaran_salida_cabecera AS cab
    JOIN cliente AS cli ON cli.id_cliente = cab.id_cliente
WHERE tipo_cliente = 'CLIENTE'
UNION ALL
SELECT cab.numero_albaran,
      cli_emp.nombre
FROM albaran_salida_cabecera AS cab
    JOIN cliente_empresa AS cli_emp ON cli_emp.id_cliente = cab.id_cliente
WHERE tipo_cliente = 'CLIENTE EMPRESA'
UNION ALL
SELECT cab.numero_albaran,
      cli_grp.nombre
FROM albaran_salida_cabecera AS cab
    JOIN empresa_grupo AS cli_grp ON cli_grp.id_cliente = cab.id_cliente
WHERE tipo_cliente = 'EMPRESA GRUPO';

El caso es q todo esto me parece una solución muy extraña para lo que pienso
debería ser un problema mas común, como creéis que debería rediseñar esto?

Gracias y un saludo,
Miguel Angel.

--
TIP 8: explain analyze es tu amigo


Un abrazo.

-la tabla "cliente" es la tabla donde mantengo a los clientes finales, personas físicas, no empresas, las operaciones con estos usuarios son venta de material en las tiendas, siempre pago al contado y tienen campos como apellido1, apellido2, sexo, fecha_nacimiento, numero_tarjeta_socio y otros q no tienen sentido para las empresas cliente.

-la tabla "empresa_cliente" es la tabla donde guardamos a las empresas que nos compran habitualmente, tienen formas de pago, descuentos, tarifas distintas y riesgos permitidos que no tienen los clientes finales.

-la tabla "empresa_grupo" es la tabla donde se guardan los datos de la empresa que forman parte del grupo de empresas, estamos formados por pequeñas sociedades y cada una puede tener una o varias tiendas, así que al enviarse un albarán intra-empresa del grupo tienen unas características especiales que luego hay q tratar, ademas no tienen riesgos y se dan un tratamiento especial por ser del grupo.

Un saludo,
Miguel Angel.
--
TIP 1: para suscribirte y desuscribirte, visita 
http://archives.postgresql.org/pgsql-es-ayuda

Responder a