Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Benötigen Sie Hilfe beim Entwerfen meiner Rechnungsdatenbankstruktur

Sie können ein Produkt nicht entfernen, sobald es definiert wurde. Fügen Sie dem Produkt also ein Statusfeld hinzu, das ich in diesem Beispiel mit einer Aufzählung verwende, obwohl es sich leicht um eine INT oder eine Reihe von Bools (z. B. Archiviert) handeln könnte Parameteraufzählungstabellen dafür aber das ist eine separate Antwort.

Das Wichtigste ist, sicherzustellen, dass der Rechnungsposten die Preise (und Beschreibungen) enthält, die dem Produkt zum Zeitpunkt der Bestellung entnommen wurden, um sicherzustellen, dass zukünftige Preisänderungen oder Änderungen des Produktnamens keine Auswirkungen auf bereits bestehende Rechnungen haben.

Die andere Technik, die ich (ziemlich erfolgreich) verwendet habe, besteht darin, das Konzept des Ersetzens einzuführen Entitäten in einer Datenbank - damit der ursprüngliche Datensatz erhalten bleibt und bei jeder Datenänderung eine neue Version eingefügt wird. Dazu füge ich die folgenden Felder hinzu:

  • aktuelleID
  • supersededById
  • vorherige ID

Das macht die Abfragen etwas umständlicher - aber gerade bei Adressen muss unbedingt darauf geachtet werden, dass die Rechnungen konstant bleiben und sich Adressänderungen nicht in den Rechnungen widerspiegeln - z.B. Das Ändern des Firmennamens sollte zuvor ausgestellte Rechnungen nicht ändern.

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