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
--
TIP 3: Si encontraste la respuesta a tu problema, publícala, otros te lo
agradecerán