sql >> Base de Datos >  >> RDS >> Mysql

Necesito ayuda para diseñar la estructura de la base de datos de mi factura

No puede eliminar un producto una vez que se ha definido, así que agregue un campo de Estado al producto que, en este ejemplo, estoy usando una enumeración, aunque podría ser fácilmente un INT o un conjunto de bools (es decir, Archivado), yo uso Tablas de enumeración de parámetros para esto, pero esa es una respuesta separada.

Lo más importante es asegurarse de que la línea de la factura tenga el precio (y la descripción) tomado del producto en el momento del pedido, para garantizar que cualquier cambio futuro en el precio o el nombre del producto no afecte las facturas preexistentes.

La otra técnica que he usado (con bastante éxito) es introducir el concepto de superación entidades en una base de datos, para que el registro original permanezca y se inserte una nueva versión cada vez que se cambien los datos. Para ello agrego los siguientes campos:

  • ID actual
  • reemplazado por Id
  • Id anterior

Hace que las consultas sean un poco más engorrosas, pero especialmente para las direcciones, es esencial asegurarse de que las facturas permanezcan constantes y que los cambios de dirección no se reflejen en las facturas, p. cambiar el nombre de la empresa no debería cambiar las facturas emitidas anteriormente.

CREATE TABLE `Invoice` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`id`)
);

CREATE TABLE `Invoice Item` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`desc` VARCHAR(200) NOT NULL ,
`value` DECIMAL(11,3) NOT NULL ,
`quantity` DECIMAL(11,3) NOT NULL ,
`total` DECIMAL(11,3) NOT NULL ,
`fk_id_Invoice` INTEGER NOT NULL ,
`fk_id_Product` INTEGER NOT NULL ,
PRIMARY KEY (`id`)
);

CREATE TABLE `Product` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`Price` DECIMAL(11,3) NOT NULL ,
`Name` VARCHAR(200) NOT NULL ,
`Status` ENUM NOT NULL ,
PRIMARY KEY (`id`)
);

ALTER TABLE `Invoice Item` ADD FOREIGN KEY (fk_id_Invoice) REFERENCES `Invoice` (`id`);
ALTER TABLE `Invoice Item` ADD FOREIGN KEY (fk_id_Product) REFERENCES `Product` (`id`);