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.
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 |