数据库设计反馈

时间:2011-06-21 15:09:47

标签: mysql sql database database-design

发票可以包含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 

如果总计是负数(例如:-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 |
+-----------+-----------+--------+---------------------+-------------+

我是在正确的道路上吗?什么可以改进/改变或建议?

感谢。

4 个答案:

答案 0 :(得分:3)

好的,你有一些严重的问题。订单有多个项目,发票有多个订单,付款可能适用于多个订单和发票。订单可能出现在多张发票上(如果他们不立即付款,这是很常见的。)

所以你需要的是链接表。您应该从具有订单ID和发票ID的ORDERINVOICE表开始。然后是一个带有paymentid和订单ID的ORDERPAYMENT表。

您还需要考虑在订购情况下,您必须记录当时发生的订单的详细信息。这意味着虽然您应该将user_id链接到当前用户,但您应该记录订单时的用户名,帐单地址和送货地址。您稍后将需要此信息来处理订单上的任何问题。此外,您需要确保将订单的详细信息存储在名为ORDERDETAILS的单独表中,该表存储单个行项目,订单时的价格以及订购商品的名称。出于会计原因,您将需要这个。在任何情况下,您都不希望依赖于产品表的连接来计算过去订单的价格。这将导致您的财务记录不准确。

答案 1 :(得分:2)

看起来不错。

我要添加的唯一内容是支付表中的交易ID /支票号等细节。这样您就可以将所有付款细节保存在一起。

答案 2 :(得分:0)

对我而言,这也是我原本应该做的。

(我认为付款与订单相关联,但如果您打算将其与发票相关联,这很好)

此致 MN

答案 3 :(得分:0)

在不了解您的要求的情况下,到目前为止一直很好。

请务必将您的发票状态和付款类型解码存储在查找表中,以便可以在数据库中强制执行,并且不必依赖程序员正确编码。