2

我有一个网站,客户可以在其中购买订阅。
客户可以随时查看付款历史记录并查看已购买的内容。

我正在尝试设计用于创建发票的数据库,但有些东西似乎不适合我。

我当前的设置如下所示:

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

invoice_item有一个引用的外键似乎是合乎逻辑的product
但是如果产品被删除会发生什么?如果它们相关,则 item_list 中的行将被删除或设置为空。

如果您想查看旧发票并且产品不再可用,这将不起作用。

那么,应该ProductItem_list相关吗?

4

3 回答 3

5

一旦定义了产品,您就无法删除它,因此向产品添加一个 Status 字段 - 在此示例中,我使用的是枚举,尽管它很容易是一个 INT 或一组布尔值(即存档),我使用参数枚举表,但这是一个单独的答案。

最重要的是确保发票行具有在订购时取自产品的定价(和描述),以确保任何未来的定价更改或产品名称更改不会影响预先存在的发票。

我使用的另一种技术(非常成功)是在数据库中引入取代实体的概念 - 以便保留原始记录并在数据更改时插入新版本。为此,我添加了以下字段:

  • 当前ID
  • 由Id取代
  • 上一个 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 回答