Anda tidak dapat menghapus produk setelah ditentukan, jadi tambahkan bidang Status ke produk yang - dalam contoh ini saya menggunakan enum, meskipun itu bisa dengan mudah menjadi INT atau satu set bool (yaitu Diarsipkan), saya gunakan Tabel Enumerasi Parameter untuk ini tapi itu jawaban yang terpisah.
Yang paling penting adalah memastikan bahwa baris faktur memiliki harga (dan deskripsi) yang diambil dari produk pada titik pemesanan, untuk memastikan bahwa setiap perubahan harga atau perubahan nama produk di masa mendatang tidak memengaruhi faktur yang sudah ada sebelumnya.
Teknik lain yang saya gunakan (cukup berhasil) adalah memperkenalkan konsep mengungguli entitas dalam database - sehingga catatan asli tetap ada dan versi baru dimasukkan setiap kali data diubah. Untuk melakukan ini, saya menambahkan bidang berikut:
- ID saat ini
- digantikanById
- Id sebelumnya
Itu membuat kueri sedikit lebih rumit - tetapi terutama untuk alamat, penting untuk memastikan bahwa faktur tetap konstan dan bahwa perubahan alamat tidak tercermin dalam faktur - mis. mengubah nama perusahaan seharusnya tidak mengubah faktur yang diajukan sebelumnya.
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`);