2

顧客がサブスクリプションを購入できる Web サイトを持っています。
顧客はいつでも支払い履歴にアクセスして、何を購入したかを確認できます。

請求書を作成するためのデータベースを設計しようとしていますが、何かがうまくいかないようです。

私の現在のセットアップは次のようになります。

+-----------+--------------+---------+
|  Invoice  | invoice_item | product |
+-----------+--------------+---------+
| id        | id           | id      | 
| fk_userID | desc         | name    |
|           | quantity     | price   |
|           | sum          |         |
|           | fk_invoiceID |         |
+-----------+--------------+---------+

invoice_itemを参照する外部キーを持つことは論理的に思えproductます。
しかし、製品が削除された場合はどうなりますか? それらが関連している場合、item_list の行は削除されるか、null に設定されます。

また、古い請求書を見たいと思っていて、製品がもう入手できない場合、それはうまくいきません.

それで、関連する必要がProductありItem_listますか?

4

3 に答える 3

5

一度定義された製品を削除することはできないため、ステータス フィールドを製品に追加します。この例では、列挙型を使用していますが、簡単に INT または一連のブール値 (つまり、アーカイブ済み) にすることができますが、使用します。このためのパラメーター列挙テーブルですが、それは別の答えです。

最も重要なことは、将来の価格変更や製品名の変更が既存の請求書に影響を与えないようにするために、注文時に製品から取得された価格 (および説明) が請求書明細に含まれていることを確認することです。

私が使用した (かなり成功した) もう 1 つの手法は、データベース内のエンティティを置き換えるという概念を導入することです。これにより、元のレコードが残り、データが変更されるたびに新しいバージョンが挿入されます。これを行うには、次のフィールドを追加します。

  • 現在のID
  • supersededById
  • 以前のID

クエリが少し面倒になりますが、特に住所の場合は、請求書が一定のままで、住所の変更が請求書に反映されないようにすることが不可欠です。たとえば、会社名を変更しても、以前に発行された請求書は変更されません。

ここに画像の説明を入力

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`);
于 2012-07-12T11:22:49.950 に答える
0

製品テーブルに no_of_stock として追加の列が必要なだけです。製品が在庫に空であるか、現在使用されていない場合は、その列の値が 0 に設定されますが、削除しないでください。これは、製品は現在販売できませんが、過去に販売されたことがあることを意味します。

于 2012-07-12T10:45:08.213 に答える
0

古い請求書が生成されてからどれだけ経っても、すべての情報を含めて、人々が古い請求書を見ることができるようにしたい場合は、製品を削除しないでください。または類似のものを含む列を追加するだけで、ENUM('active', 'inactive') NOT NULL現在提供している製品と、古い参照用にのみ保持している製品とを区別できます。

于 2012-07-12T10:46:40.577 に答える