定義された製品は削除できないため、製品にステータスフィールドを追加します。この例では、列挙型を使用していますが、INTまたはboolのセット(つまり、アーカイブ済み)である可能性がありますが、 パラメータ列挙テーブル これについては別の答えです。
最も重要なことは、請求書の行に注文時に製品から取得した価格(および説明)が含まれていることを確認し、将来の価格変更または製品名の変更が既存の請求書に影響を与えないようにすることです。
私が(かなり成功して)使用したもう1つの手法は、優先の概念を導入することです。 データベース内のエンティティ-データが変更されるたびに元のレコードが残り、新しいバージョンが挿入されるようにします。これを行うには、次のフィールドを追加します:
- currentID
- supersededById
- previousId
クエリが少し面倒になりますが、特に住所の場合、請求書が一定に保たれ、住所の変更が請求書に反映されないようにすることが不可欠です。会社名を変更しても、以前に発生した請求書は変更されません。
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`);