[ Foro de SQL (y MySQL) ]

Diseño de base de datos

14-Jan-2017 18:54
Invitado (annx10)
2 Respuestas

Hola, estoy diseñando un programa, y tras haber planificado la base de datos, estoy dudando sobre la conveniencia de un determinado campo. Me explico:

Tengo la tabla PEDIDOS con:
ID (clave primaria), fecha, estado, etc

Tengo la tabla ARTICULOS con:
ID (clave primaria), referencia, nombre, etc

Tengo la tabla ENTREGAS con:
ID (clave primaria), fecha, albaran

Para almacenar las entregas que se van recibiendo de los pedidos, tengo la tabla DETALLES_ENTREGA con:
id_entrega (fk que depende de la tabla entregas), id_pedido (fk que depende de la tabla pedidos), id_articulo (fk que depende de la tabla articulos) y cantidad_entregada. La clave primaria de esta tabla son los tres primeros campos (id_entrega - id_pedido - id_articulo).

Mi duda es si lo que he hecho es lo más adecuado, no está mal del todo o si debería cambiarlo, eliminando de la tabla DETALLES_ENTREGA el campo id_pedido, añadiéndolo a la tabla ENTREGAS.
De esta forma tendría en la tabla ENTREGAS cuatro campos, recogiendo para cada entrega el pedido con el que se relaciona, y en la tabla DETALLES_ENTREGA un campo menos, pero aún así la información suficiente sobre el id de la entrega, el id del artículo entregado y la cantidad entregada.

Espero haberme explicado bien.
Muchas gracias de antemano.

Saludos.


16-Jan-2017 14:05
Nacho Cabanes (+30)

Es un poco difícil verlo claramente sólo a partir de texto. Lo ideal es que comiences creando un diagrama Entidad-Relación, porque su conversión posterior a tablas es algo "mecánico", que sigue siempre las mismas pautas. Si lo haces directamente desde texto, a veces no es tan evidente si la relación es binaria o ternaria, si su cardinalidad es 1:M:M o 1:1:M o M:M:M, etc., y de esos detalles depende la elección correcta de las claves primarias y de las claves ajenas.

Por ejemplo, no tengo claro si la tabla ENTREGA representa la cabecera de una entrega (¿qué diferencia haces entre albarán y entrega?) y si DETALLES_ENTREGA son las líneas de detalle de una entrega (la parte inferior de un albarán que mirases en un papel). En ese caso, el código del pedido debería ser un campo de la entrega y no de cada detalle... salvo que el código de la entrega tuviera una clave compuesta, que no es el caso.

El que la clave primaria de DETALLES_ENTREGA sea id_entrega, id_articulo debería bastar en la mayoría de los casos (salvo que en un mismo albarán puede aparecer varias veces el mismo artículo, porque se hayan agrupado varios pedidos para enviarlos juntos, que no parece tu caso). Pero insisto, todo son suposiciones si no se ve un diagrama E-R, que es la herramienta adecuada para el diseño.


16-Jan-2017 16:06
Invitado (annx10)

Hola, Nacho, en primer lugar agradecerte la respuesta que has planteado a mi duda.

Te entiendo perfectamente en lo relativo a la dificultad de comprender todo lo que supone el programa que he diseñado, sin conocer todos los detalles de la problemática que intento solucionar con él.
El diagrama de E-R lo realicé en un principio, y creía que lo había planteado bien, esta duda es algo que me surgió cuando había avanzado ya en la programación de las consultas, lo que me hizo plantearme que no escogí bien el diseño.

Aclarándolo un poco, para mi caso cada entrega se corresponde con cada uno de los albaranes que van llegando a la empresa procedente de los proveedores, que van haciendo entregas (en muchos casos parciales) de los pedidos que previamente se han registrado. Como supones, en mi caso nunca un artículo se va a repetir dentro de un albarán de entrega (y si lo hiciera el usuario al registrar la entrega en el programa sumaría las cantidades y las indicaría juntas), al igual que tampoco se va a repetir un mismo artículo dentro de un pedido.
Había visto diseños donde se utiliza el número de línea para salvar este escollo cuando se repiten artículos, pero para mi caso no me hacía falta.

Además, efectivamente como dices la tabla ENTREGAS se correspondería con los datos de cabecera de las entregas (con ID como clave primaria, fecha de la entrega y nº del albarán), y la tabla DETALLES_ENTREGA recoge las líneas que componen las entregas (lo que como bien dices sería la información de los artículos especificados más abajo en cada albarán).

Por ello, y como me confirmas, veo que estaba equivocado al poner el ID del pedido en cada una de las líneas de la tabla DETALLES_ENTREGA. Así, tal y como me has dicho, veo que lo mejor es que cada línea recoja el id_artículo y el id_entrega (sin posibilidad de que se pudiera repetir ese par de claves, por lo que se mantendrían como clave primaria) y dentro de la tabla ENTREGAS, incorporar una columna con el id_pedido para cada entrega, de modo que queden relacionados.

Espero que ahora haya quedado todo mucho más claro.

Muchas gracias.
Saludos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)