Re: [pgsql-es-ayuda] Consulta diseño

From: Silvio Quadri <silvioq(at)gmail(dot)com>
To: Linos <info(at)linos(dot)es>
Cc: Lista PostgreSql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Consulta diseño
Date: 2009-04-15 16:49:37
Message-ID: 61dc71dc0904150949n39ddfe53x59c3cc240f7074dd@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 15 de abril de 2009 11:53, Linos <info(at)linos(dot)es> 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.
>
> 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.
>
> 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.
>

Podrías normalizarla usando un identificador distinto por cada tabla
referida en la tabla maestra, que también te permitiría crear FKs.
En tu ejemplo, la tabla albaran_salida_cabecera tendría un id_cliente,
un id_empresa_cliente y un id_empresa_grupo y eliminarías el campo
tipo_cliente.

Silvio

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2009-04-15 16:59:25 Re: funciones de depuracion
Previous Message Alvaro Herrera 2009-04-15 16:22:48 Re: funciones de depuracion