Jakmile byl produkt definován, nelze jej odebrat, takže k produktu přidejte pole Stav, které - v tomto příkladu používám výčet, ačkoli to může být snadno INT nebo sada boolů (tj. Archivováno), používám Tabulky výčtu parametrů pro toto, ale to je samostatná odpověď.
Nejdůležitější je zajistit, aby na řádku faktury byly ceny (a popis) převzaty z produktu v okamžiku objednávky, aby se zajistilo, že jakékoli budoucí změny cen nebo změny názvu produktu neovlivní již existující faktury.
Další technikou, kterou jsem (celkem úspěšně) použil, je zavedení konceptu nadřazení entity v databázi - tak, aby zůstal původní záznam a při každé změně dat byla vložena nová verze. K tomu přidám následující pole:
- aktuální ID
- supersededById
- předchozíId
Trochu to ztěžuje dotazy - ale zejména u adres je nutné zajistit, aby faktury zůstaly konstantní a aby se změny adres nepromítly do faktur - např. změna názvu společnosti by neměla změnit dříve vystavené faktury.
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`);