sql >> Database >  >> RDS >> Mysql

Hulp nodig bij het ontwerpen van mijn factuur-db-structuur

U kunt een product niet verwijderen als het eenmaal is gedefinieerd, dus voeg een Status-veld toe aan het product dat - in dit voorbeeld gebruik ik een enum, hoewel het gemakkelijk een INT of een set bools kan zijn (d.w.z. Gearchiveerd), ik gebruik Parametertellingstabellen hiervoor, maar dat is een apart antwoord.

Het belangrijkste is om ervoor te zorgen dat op de factuurregel de prijs (en beschrijving) is overgenomen van het product op het moment van bestelling, om ervoor te zorgen dat eventuele toekomstige prijswijzigingen of wijzigingen in de productnaam geen invloed hebben op reeds bestaande facturen.

De andere techniek die ik (met veel succes) heb gebruikt, is het introduceren van het concept van superceden entiteiten in een database - zodat het oorspronkelijke record blijft bestaan ​​en een nieuwe versie wordt ingevoegd wanneer gegevens worden gewijzigd. Hiervoor voeg ik de volgende velden toe:

  • huidige ID
  • supersededById
  • vorigeId

Het maakt de vragen wat omslachtiger - maar vooral voor adressen is het essentieel om ervoor te zorgen dat de facturen constant blijven en dat adreswijzigingen niet worden weerspiegeld in de facturen - b.v. het wijzigen van de bedrijfsnaam zou eerder opgemaakte facturen niet moeten veranderen.

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


  1. Inner join met like-clausule

  2. mysql (bijna) volledige controle

  3. Hoe slaat MySQL Enums op?

  4. Hoe plaats ik een tijdstempel in Oracle?