Du kan ikke fjerne et produkt, når det først er blevet defineret, så tilføj et statusfelt til produktet, som - i dette eksempel bruger jeg en enum, selvom det nemt kunne være en INT eller et sæt bools (dvs. Arkiveret), jeg bruger Parameteroptællingstabeller for dette, men det er et separat svar.
Det vigtigste er at sikre, at fakturalinjen har prisen (og beskrivelsen) hentet fra produktet på bestillingsstedet, for at sikre, at eventuelle fremtidige prisændringer eller produktnavneændringer ikke påvirker allerede eksisterende fakturaer.
Den anden teknik, som jeg har brugt (ganske med succes) er at introducere konceptet overskridelse enheder i en database - så den originale post forbliver, og en ny version indsættes, hver gang data ændres. For at gøre dette tilføjer jeg følgende felter:
- aktuelt ID
- supersededById
- forrige id
Det gør forespørgslerne lidt mere besværlige - men især for adresser er det essentielt at sikre, at fakturaerne forbliver konstante, og at adresseændringer ikke afspejles i fakturaerne - f.eks. ændring af firmanavn bør ikke ændre tidligere rejste fakturaer.
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`);