Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Diseñar Base de Datos de Un Sistema de Facturación
Diseñar Base de Datos de Un Sistema de Facturación
En este artículo estudiaremos el diseño de una base de datos para un sistema de facturación, a
través de un enfoque generalizado. Veremos que entidades, atributos y relaciones existen y como
normalizar las anomalías ocurrentes.
La primera tarea es identificar todas las entidades posibles que vayan a intervenir en el proceso de
facturación de la empresa. Normalmente estas entidades ya están definidas previamente en el
Modelo de datos para la elaboración de los Componentes de Software.
Registrar el Id, Nombre, Apellido, Dirección, Fecha de nacimiento, Teléfono y el Correo electrónico
de los clientes de la compañía.Registrar para los productos la siguiente información: Código,
Nombre, Precio, Número de Existencias y Categoría a la que pertenece.Se debe especificar en la
factura los Datos del cliente y una tabla que muestre la Especificación del tipo de producto
comprado, su precio, la cantidad suministrada y el total parcial. Al final de la factura debe
calcularse el valor antes de impuestos y descuentos, y luego calcular el valor total de la compra.Un
cliente puede pagar con las siguientes formas de pago: Efectivo, Tarjeta de crédito, Tarjeta débito,
Paypal y Neteller.Un cliente puede generar varias facturas debido a sus distintas compras, pero
jamás una misma factura podrá haber sido generada por más de un cliente.En una factura pueden
contener varios productos vinculados, al igual que todos los productos están posibilitados a
aparecer en todas las facturas.Un cliente puede pagar el monto total de una factura con
varios métodos de pago.…
Estas condiciones pueden cambiar dependiendo de las necesidades del cliente, ya que pueden
variar sus procesos de facturación o añadir más atributos relevantes para ellos. Pero para los
objetivos de este articulo usaremos solo las características esenciales.
Crear El Modelo Relacional A Partir De Los Requerimientos
Bueno, es sencillo pensar en que primero están las personas que dan vida al negocio, es decir, la
entidad CLIENTE. Luego viene la satisfacción de las necesidades del cliente a través del PRODUCTO.
Y también es necesario entregar una FACTURA para constatar la entrega del producto.
Por el momento CLIENTE, FACTURA y PRODUCTO son las entidades más relevantes, cuya
información debe ser almacenada en la base de datos. Veamos el Diagrama Relacional preliminar
para comprender este caso:He puesto los signos de interrogación en las llaves foráneas de
FACTURA y PRODUCTO debido a que esta relación muchos a muchos es compleja. Para entenderla
quiero mostrarte las partes de una factura con un sencillo diseño perteneciente a una Tienda de
artículos para Computadoras.
La cabecera de la factura(Recuadro AMARILLO) contiene los datos del cliente y las característica de
la factura. Al final(Recuadro AZUL) se obtiene el resultado total de toda la compra. Como ves en el
detalle(Recuadro ROJO) se encuentra una tabla que muestra que productos han sido comprados
por el cliente en esta ocasión, la cual representa la relación de factura y producto.
Recuerda que cuando se presenta una relación muchos a muchos debemos reemplazar esa
relación por una tabla intermediaria que reciba las claves principales de ambas tablas
referenciadas. Ademas de eso, las tablas originales deben tener una relación uno a muchos con la
tabla intermedia. Esto permite optimizar y normalizar los datos.
Así que crearemos una nueva tabla llamada DETALLE en alusión a cada renglón detallado en la
factura. Veamos como quedaría el diagrama ahora:
¿Por qué se usa la llave compuesta PK= {id_factura, num_detalle} en vez de PK= {id_factura,
id_producto}?
Para diferenciar el orden de los items en la factura. Es decir, que al declarar “El tercer producto de
la factura N” podamos entender rápidamente a que nos referimos. Algo que visualmente podría
ser poco intuitivo de notar con la otra llave candidata.
1 101 SDA 2 3
2 101 SDB 3 5
1 102 SDA 1 3
1 103 SDC 4 7
Fíjate que en la factura 101 podemos distinguir que el primer item registrado es el producto con
código «SDA«, ya que num_detalle es igual a 1. Y que el producto con código «SDB» esta ubicado
en el segundo renglón detallado de la factura.
Si la clave primaria fuera id_factura + id_producto no tendríamos claro el orden de los productos
comprados. Es por eso que agregar el atributo num_detalle es tan beneficioso para nosotros.
¿Por qué esta el precio del producto en DETALLE y en PRODUCTO al mismo tiempo?
A primera impresión parece redundancia de datos al extremo, pero hay un secreto escondido. La
razón por la cual indujimos esta redundancia fue por que los precios de los productos varían en el
mercado.¿Importante?…
¡Claro!, imagina que un Almacén de Ropa está vendiendo la camisa de la selección de Fútbol en
10USD. Debido a que al equipo le está yendo muy bien en los últimos partidos, muchas personas
vienen a comprar la camisa. Al dueño se le ocurre subir a 12USD el precio de la camisa, ya que la
demanda así lo está imponiendo.
finally de mes la Tienda de Ropa ejecuta un reporte para ver el ingreso total por ventas,
donde se muestra que la cantidad de money contado no coincide con the
courage del sistema.
¿Que pasó?
Miremos algunos cálculos pretenciosos antes y después del cambio de precio
Antes de la manifestación aumentada de demanda
Precio = 10USD
Precio = 12USD
ARTICULO.precio = 12USD
Son 400USD de más!, es decir, tu Software está produciendo un error del 8% en el ingreso total
por ventas. Algo desastroso para tu reputación. Al no incluir este atributo has calculado los
ingresos con el precio actual que refleja ARTICULO.precio, por lo cual todas las unidades valen lo
mismo.
DETALLE.precio= 10USD
DETALLE.precio = 12USD
Con esta redundancia inducida puedes tener el cálculo exacto para cada producto en el momento
actual, porque DETALLE cumple la función de mantener el mismo estado para cada renglón en la
factura a lo largo del tiempo.
Porque son atributos derivados. Es decir, podemos calcularlos a través del precio del producto y la
cantidad cuando queramos. Guardarlos en nuestra base de datos sería espacio de
almacenamiento adicional.
En cambio, si realizamos los cálculos en tiempo real, a nuestra aplicación solo le tomaría un
pequeño instante de tiempo que no interferiría con la velocidad de nuestro Software Comercial. Es
un sacrificio de tiempo vs memoria muy efectivo.
id_categoría nombre
1 TECNO
2 COMIDA
3 BEBIDA