Mysql
 sql >> Database >  >> RDS >> Mysql

Ho bisogno di aiuto per progettare la mia struttura db fattura

Non puoi rimuovere un prodotto una volta che è stato definito, quindi aggiungi un campo Stato al prodotto che - in questo esempio sto usando un enum, anche se potrebbe facilmente essere un INT o un set di bool (cioè archiviato), io uso Tabelle di enumerazione dei parametri per questo, ma questa è una risposta separata.

La cosa più importante è assicurarsi che la riga della fattura abbia il prezzo (e la descrizione) preso dal prodotto al momento dell'ordine, per garantire che eventuali modifiche future al prezzo o al nome del prodotto non influiscano sulle fatture preesistenti.

L'altra tecnica che ho usato (abbastanza con successo) è quella di introdurre il concetto di superamento entità in un database - in modo che il record originale rimanga e venga inserita una nuova versione ogni volta che i dati vengono modificati. Per fare ciò aggiungo i seguenti campi:

  • ID corrente
  • sostituitoById
  • ID precedente

Rende le query un po' più macchinose, ma soprattutto per gli indirizzi è essenziale assicurarsi che le fatture rimangano costanti e che i cambiamenti di indirizzo non si riflettano nelle fatture, ad es. la modifica del nome dell'azienda non dovrebbe modificare le fatture emesse in precedenza.

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`);