sql >> Databasteknik >  >> RDS >> Mysql

Behöver hjälp med att designa min fakturadb-struktur

Du kan inte ta bort en produkt när den väl har definierats, så lägg till ett statusfält i produkten som - i det här exemplet använder jag en enum, även om det lätt kan vara en INT eller en uppsättning bools (dvs. Arkiverad), jag använder Parameteruppräkningstabeller för detta men det är ett separat svar.

Det viktigaste är att se till att fakturaraden har prissättningen (och beskrivningen) hämtad från produkten vid beställningstillfället, för att säkerställa att framtida prisändringar eller produktnamnsändringar inte påverkar redan existerande fakturor.

Den andra tekniken som jag har använt (ganska framgångsrikt) är att introducera begreppet superceding enheter i en databas - så att den ursprungliga posten finns kvar och en ny version infogas när data ändras. För att göra detta lägger jag till följande fält:

  • aktuellt ID
  • supersededById
  • föregåendeId

Det gör frågorna lite krångligare - men speciellt för adresser är det viktigt att se till att fakturorna förblir konstanta och att adressändringar inte återspeglas i fakturorna - t.ex. att byta företagsnamn bör inte ändra tidigare upptagna fakturor.

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. Fortsätt fylla i HTML-formulär efter stängning och öppna igen

  2. SQLite Sum() vs Total():Vad är skillnaden?

  3. Hur man undviker tävlingskondition med unika kontroller i Django

  4. Hur man använder förberedda uttalanden i Zend Framework