Re: Consulta diseño

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

Silvio Quadri escribió:
> 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

Esto no lo había pensado y la verdad que lo de no poder poner los FK me estaba
molestando bastante y era uno de los motivos por los que daba por hecho que el
diseño no podía ser bueno, gracias por el consejo.

Un saludo,
Miguel Angel.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Linos 2009-04-15 19:06:58 Re: Consulta diseño
Previous Message Alvaro Herrera 2009-04-15 18:56:05 Re: Utilizar un Web Services en PL/pgsql