Mysql
 sql >> Base de données >  >> RDS >> Mysql

Besoin d'aide pour concevoir la structure de ma base de données de facturation

Vous ne pouvez pas supprimer un produit une fois qu'il a été défini, alors ajoutez un champ Status au produit qui - dans cet exemple, j'utilise une énumération, bien qu'il puisse facilement s'agir d'un INT ou d'un ensemble de booléens (c'est-à-dire Archivé), j'utilise Tables d'énumération des paramètres pour cela, mais c'est une réponse distincte.

La chose la plus importante est de s'assurer que la ligne de facture contient le prix (et la description) du produit au moment de la commande, pour s'assurer que tout changement de prix ou de nom de produit futur n'affecte pas les factures préexistantes.

L'autre technique que j'ai utilisée (avec assez de succès) consiste à introduire le concept de remplacement entités dans une base de données - de sorte que l'enregistrement d'origine reste et qu'une nouvelle version soit insérée chaque fois que les données sont modifiées. Pour cela j'ajoute les champs suivants :

  • ID actuel
  • supersededById
  • Id précédent

Cela rend les requêtes un peu plus lourdes - mais surtout pour les adresses, il est essentiel de s'assurer que les factures restent constantes et que les changements d'adresse ne sont pas reflétés dans les factures - par ex. changer le nom de l'entreprise ne devrait pas modifier les factures émises précédemment.

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