Mysql 需要帮助设计我的发票数据库结构吗
我有一个客户可以购买订阅的网站。Mysql 需要帮助设计我的发票数据库结构吗,mysql,database-design,Mysql,Database Design,我有一个客户可以购买订阅的网站。 客户可以随时查看付款历史记录,查看ben购买了什么 我正在尝试设计用于创建发票的db,但有些东西似乎不适合我 我当前的设置如下所示: +-----------+--------------+---------+ | Invoice | invoice_item | product | +-----------+--------------+---------+ | id | id | id | | fk_user
客户可以随时查看付款历史记录,查看ben购买了什么 我正在尝试设计用于创建发票的db,但有些东西似乎不适合我 我当前的设置如下所示:
+-----------+--------------+---------+
| Invoice | invoice_item | product |
+-----------+--------------+---------+
| id | id | id |
| fk_userID | desc | name |
| | quantity | price |
| | sum | |
| | fk_invoiceID | |
+-----------+--------------+---------+
似乎合乎逻辑的是,invoice\u项目
有一个外键引用了产品
但如果产品被删除会发生什么?如果它们是相关的,则项目列表中的行将被删除或设置为空 如果您想查看旧发票,而产品不再可用,那么这将不起作用
因此,
Product
和Item\u list
是否相关?您只需要在Product表中添加一列,作为no\u of\u stock。如果产品在库存中为空或当前未使用,则不应删除,而应将该列的值设置为0。这意味着,尽管产品目前无法销售,但以前已经销售过,并且已经存在。如果您希望人们能够看到他们的旧发票,无论发票是在多长时间前生成的,并且包含所有信息,那么您不应该删除产品。只需添加一个列,其中包含一个不为NULL的枚举(“活动”、“非活动”)或类似项,以区分您当前提供的产品和您仅保留用于旧参考的产品。一旦定义了产品,您就无法删除该产品,因此请向该产品添加一个状态字段,在本例中,我使用的是枚举,虽然它可以很容易地是一个INT或一组bool(即存档),但我使用它,但这是一个单独的答案
最重要的是确保发票行在订购时从产品中获取定价(和描述),以确保任何未来的定价更改或产品名称更改不会影响预先存在的发票
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`);
我使用的另一种技术(相当成功)是在数据库中引入替代实体的概念,以便在数据更改时保留原始记录并插入新版本。为此,我添加了以下字段:
- 当前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`);
谢谢你的反馈。这样做正常吗?是的,这绝对是正常的,伙计:-)类似于萨西·康德的回答。所以这个解决方案是标准的?谢谢你的回答。我的地址表中的地址永远不会被删除。因此,如果客户更改了帐单地址,将使用一个新ID:)您使用了哪种工具来改善图像?-javascript在浏览器中运行,它简单易用。我也有类似的情况,你的回答真的很有帮助。还有一点我无法理解。我同意“最重要的是确保发票行的定价(和说明)在订购时取自产品”,但既然如此,发票项
为什么仍要引用(有FK)到产品
?保持这种关系有什么好的理由吗?丢弃它是否有缺点?需要发票项目上的FK以确保参考完整性;确保您仅为有效产品开具发票。它在报告中也很有用,例如,找出哪些产品已开具发票以及销售净值。不要删除您的产品。有一个from_日期和一个(可空)to_日期,如果to_日期不为空,则不显示它们。