El día 15 de abril de 2009 11: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. > > 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 -- TIP 8: explain analyze es tu amigo
