Estoy diseñando una base de datos para un sistema de e-commerce. Tengo una duda clásica pero que me trae de cabeza en este proyecto específico.
La tabla pedidos tendría: id, usuario_id, fecha, estado, total. Luego una tabla detalles_pedido con: id, pedido_id, producto_id, cantidad, precio_unitario.
Mi dilema: El precio_unitario en detalles_pedido. Purista de la normalización dice: "¡Es un atributo del producto! Solo guarda producto_id y saca el precio de la tabla productos cuando lo necesites". Pero... ¿y si el precio del producto cambia? Un historial de pedidos mostraría precios incorrectos.
La solución "correcta" sería tener un historial de precios de productos y relacionar detalle_pedido con un precio_id de ese historial. ¡Pero eso son 3 joins solo para mostrar un pedido!
En la práctica, veo que muchos guardan el precio redundante en detalles_pedido y punto. ¿Hasta dónde llega vuestra normalización? ¿Cuándo dicen "basta" por rendimiento o simplicidad?
Pongo un ejemplo de código de la estructura "purista":
SELECT
p.id,
u.nombre,
dp.cantidad,
ph.precio AS precio_unitario_historico
FROM pedidos p
JOIN usuarios u ON p.usuario_id = u.id
JOIN detalles_pedido dp ON p.id = dp.pedido_id
JOIN precio_historico ph ON dp.producto_id = ph.producto_id
AND p.fecha BETWEEN ph.fecha_inicio AND ph.fecha_fin;¡Un join extra solo por el precio! ¿Vale la pena?