Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/05/2016, 05:43
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ejemplo BD relacional

En principio, SI, este sería el diseño básico que debes usar:
Cita:
Clientes
Factura
Productos
FacturaProducto
De todos modos, la forma en que describes algunas cosas (" Clientes (nif, nombre, id_factura)", por ejemplo), y tu pregunta ("van a estar todas las facturas juntas?") muestra que desconoces completa y profundamente los principios del modelo entidad - relacion (sin pretender ofender). Por ello te recomiendo antes que nada que trates de ver lo básico, o de lo contrario los errores que cometerás serán letales para tu proyecto.
Las reglas no son difíciles, pero tienes que no pensar las cosas como programador (Java o lo que sea), porque no se miran desde BBDD de la misma forma.

Por lo pronto, lo que se definen en el Modelo E-R de las bases de datos relacionales NO SON CLASES, sino Entidades, y las Entidades poseen Atributos, pero no tienen ni Propiedades ni comportamientos o métodos, lo que ya marca una gran diferencia.
Hay asociatividad, pero no existe composición, y la instanciación de una Entidad no existe. Cuando hablas de instancias en la base de datos te estás refiriendo en realidad al conjunto de valores que una relación (no sólo una clase) toma en el mundo real, de acuerdo a las entidades que están en tal relación y las entidades que representamos.

Las diferencias lelgan a tal punto que las relaciones pueden representarse en el modelo físico como entidades virtuales, lo que da como resultado tablas físicas (eso es lo que en realidad es ñla tabla FacturaProducto.

Finalmente, una regla universal y simple: La base debe estar desacoplada de la aplicación que la usa, lo que quiere decir que tu bien podrías cambiar toda la aplicación, y hasta el LENGUAJE usado, sin modificar nada de la base o sus objetos.

¿Se entiende?

Dicho esto, pasemos a la pregunta más básica:

Cita:
Factura (id, lista_productos) // no sé como relacionar una lista
No existen listas, eso está en el detalle de la factura, lo que significa que una factura es en realidad DOS tablas:
Cita:
Cabecera_Factura(nro_factura, tipo_factura, id_cliente, fecha_factura, descuentos...)
Detalle_factura(nro_factura, nro_item, , id_producto, producto_cantidad, ...)
Por su lado, esto está MAL:
Cita:
Clientes (nif, nombre, id_factura)
La factura NO ES un atributo del Cliente. Si lo fuera tendrías que ingresar una vez el mismo cliente por cada factura que se le haya emitiodo, lo que es un error básico.
Como tal vez notes por el esquema anterior, el cliente se relaciona con la FACTURA, en una cardinalidad 1:N, dado que del mismo cliente pueden existir N facturas. Esto implica que la dependencia funcional es de la Factura al cliente, y no al revés.

¿Se entiende?

FacturaProducto, en la descripcion que te hago, es lo que está representado en Detalle_factura, por lo que en realidad estamos incluyendo lo mismo.


Este sería un esquema generico: (recordar que "invoices" es lo miso que Factura):

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 26/05/2016 a las 06:27