mysql - 数据库设计反馈

标签 mysql sql database database-design

一张发票可以包含一个或多个订单,如何存档?

发票示例:

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 |
+-----------+-----------+--------+---------------------+-------------+

我走的路对吗?有什么可以改进/改变或建议的?

谢谢。

最佳答案

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

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

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

关于mysql - 数据库设计反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6427584/

相关文章:

mysql - 从 MySQL 中的外部数据中选择

c# - 如何通过主键获取大量数据库表记录?

sql - 单个查询中的 Bigquery SQL Multiple Count group-by

mysql - SQL LIKE 是否迭代表的每一行

database - Cassandra:如何在没有EQ或IN限制的PRIMARY KEY的情况下使用 'ORDER BY'?

mysql - 学校考勤系统的数据库设计

sql - 如何将数据库上下文切换到新创建的数据库?

c# - Visual C# Winforms 数据库问题

PHP/MySQL : Move data from old database (tables without an ID) to new database (tables with an ID)

mysql - 一行查询重复计算总和