Re: Consulta diseño

From: Daniel Egea <degea(at)plq(dot)es>
To: Linos <info(at)linos(dot)es>
Cc: Lista PostgreSql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consulta diseño
Date: 2009-04-16 07:30:19
Message-ID: 49E6DE8B.3010301@plq.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Linos 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.
>
> --
> TIP 8: explain analyze es tu amigo
>
Cuando me he enfrentado a problemas por ese estilo he optado por hacer
lo siguiente:
- Mantener una tabla (en tu caso 'clientes') que es a la que va a
referenciar 'albaranes' mediante su PK. En esta tabla tendría únicamente
el identificador y el tipo de cliente y los datos comunes que pudiera
tener de un cliente, sea del tipo que sea.
- Tres tablas para los distintos tipos de clientes cuya PK coincide con
la PK de 'clientes' (o con otro campo en clientes que sea FK a la PK de
estas tablas) y con los campos que diferencian estos tres tipos de clientes.

Y ahora dos caminos para facilitar el tratamiento de este esquema
- Se puede intentar ocultar la existencia de estas tres tablas mediante
triggers de 'cliente' que actualicen las otras tres tablas
- Se puede crear una vista actualizable que se encargue de estos menesteres

Todo esto te lo premite postgre

Desde luego, creo que, el objetivo es que a nivel de programa no sea
necesario invocar a las 3 tablas 'detalle'

Saludos

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Silvio Quadri 2009-04-16 12:47:46 Re: Ayuda..!
Previous Message Segurinfo Col 2009-04-16 05:43:36 Ayuda..!