【发布时间】:2011-06-21 15:09:47
【问题描述】:
一张发票可以包含 1 个或多个订单,如何归档?
发票示例:
OrderID | Order Date | Amount
31 10/02/2011 £1.50
43 12/02/2011 £1.50
74 13/02/2011 £5.00
=======
Total £8.00
如果 Total 为负数(例如:-8.00),则表示客户欠我钱。 没有减号,我付给客户一些钱。
这是我想出的:
订单表
CREATE TABLE IF NOT EXISTS `orders` (
`OrderID` int(11) NOT NULL AUTO_INCREMENT,
`Total` decimal(6,2) NOT NULL,
`OrderDate` datetime NOT NULL,
`Status` int(11) NOT NULL,
`userID` int(11) NOT NULL,
`InvoiceID` int(11) NOT NULL,
PRIMARY KEY (`OrderID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
发票表
CREATE TABLE IF NOT EXISTS `invoice` (
`InvoiceID` int(11) NOT NULL DEFAULT '0',
`InvoiceDate` datetime NOT NULL,
`Amount` decimal(6,2) NOT NULL,
`Status` int(11) NOT NULL,
PRIMARY KEY (`InvoiceID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
invoice.Status(0 正在处理,1 发票已发送,2 已取消,3 已完成) 或者还有什么更好的状态?
付款表
CREATE TABLE IF NOT EXISTS `payment` (
`PaymentID` int(11) NOT NULL AUTO_INCREMENT,
`InvoiceID` int(11) NOT NULL,
`Amount` decimal(6,2) NOT NULL,
`DatePayment` datetime NOT NULL,
`PaymentType` int(11) NOT NULL,
PRIMARY KEY (`PaymentID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
payment.PaymentType =(1:从客户那里收到的付款(欠款),2:发送给客户的付款)
数据库结果:
mysql> select * from orders;
+---------+-------+---------------------+--------+--------+-----------+
| OrderID | Total | OrderDate | Status | userID | InvoiceID |
+---------+-------+---------------------+--------+--------+-----------+
| 1 | 20.00 | 2011-06-18 15:51:51 | 1 | 123 | 1 |
| 2 | 10.00 | 2011-06-19 15:51:57 | 1 | 123 | 1 |
| 3 | 5.00 | 2011-06-20 15:52:00 | 1 | 123 | 1 |
+---------+-------+---------------------+--------+--------+-----------+
mysql> select * from invoice;
+-----------+---------------------+--------+--------+
| InvoiceID | InvoiceDate | Amount | Status |
+-----------+---------------------+--------+--------+
| 1 | 2011-06-30 15:55:21 | 35.00 | 1 |
+-----------+---------------------+--------+--------+
mysql> select * from payment;
+-----------+-----------+--------+---------------------+-------------+
| PaymentID | InvoiceID | Amount | DatePayment | PaymentType |
+-----------+-----------+--------+---------------------+-------------+
| 1 | 1 | 35.00 | 2011-06-29 15:56:16 | 1 |
+-----------+-----------+--------+---------------------+-------------+
我走对了吗?有什么可以改进/改变或建议?
谢谢。
【问题讨论】:
-
看起来不错 - 我建议在
orders和invoices上都有Status有点令人困惑。如果订单的状态可以独立于发票,那就没问题了。 -
感谢您在原始问题中包含架构。很多人没有。我没有看到它们在这里定义,所以不要忘记索引你的外键(
orders.userID,orders.InvoiceID,payment.InvoiceID)。 -
根据费用的应用方式,
orders上的Total可能还不够。您可能需要Cost和Quantity。此外,您可能需要向Invoice收取额外费用,例如运输,处理。换句话说,发票金额将是总订单成本 * 数量 + 运输 + 处理。 -
@Blazes 发票只能包含已完成的订单(例如:order.status = 1)。
-
谢谢Wiseguy,下次我会做的:)
标签: mysql sql database database-design