2 주마다 시스템에서 회사에 대한 송장을 생성합니다.
회사는 매달 1 일과 16 일에 송장을받습니다. (2 주마다 Cron Job을 통해 실행됩니다. 주문 테이블을 스캔 한 다음 '인보이스'테이블에 추가합니다. 대안이 있습니까?)
표에 고객 주문 목록이 orders
있으며 해당 회사가 속한 회사도 표시합니다 ( orders.company_id
).
invoice
테이블 은 테이블에서 주문의 총 비용을 계산 orders
합니다.
합리적인 송장 추적을 디자인하는 방법을 알아 내려고 노력 중입니다. 언젠가 회사에서 수수료를 보내거나 언젠가 수수료를 보내야 할 것입니다 ( invoice.amount
)
다음을 사용하여 송장을 추적해야합니다.
- 회사가 금액을 보냈을 때
- 언제 회사에 금액을 보냈습니까?
- 회사로부터받은 금액
- 회사에 얼마를 보냈습니까
- 전체 금액을 받았습니까? (아니라면 Db에서 무엇을 업데이트해야합니까?)
- 송장 상태 (송장 발송, 취소됨, 수취 량, 송금액)
내가 생각해 낸 데이터베이스 디자인은 다음과 같습니다.
회사 테이블
mysql> select * from company;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Company A |
| 2 | Company B |
+----+-----------+
고객은 내 웹 사이트에서 회사를 선택할 수 있습니다.
주문 테이블
mysql> select * from orders;
+----+---------+------------+------------+---------------------+-----------+
| id | user_id | company_id | total_cost | order_date | status_id |
+----+---------+------------+------------+---------------------+-----------+
| 1 | 5 | 2 | 25.00 | 2012-02-03 23:30:24 | 1 |
| 2 | 7 | 2 | 30.00 | 2012-02-13 18:06:12 | 1 |
+----+---------+------------+------------+---------------------+-----------+
두 고객이 회사 B ( orders.company_id = 2
) 로부터 제품을 주문했습니다 . 주문 필드로는 충분하지 않으며 간단하게 알 수 있습니다.
orders_products 테이블
mysql> select * from orders_products;
+----+----------+------------+--------------+-------+
| id | order_id | product_id | product_name | cost |
+----+----------+------------+--------------+-------+
| 1 | 1 | 34 | Chair | 10.00 |
| 2 | 1 | 25 | TV | 10.00 |
| 3 | 1 | 27 | Desk | 2.50 |
| 4 | 1 | 36 | Laptop | 2.50 |
| 5 | 2 | 75 | PHP Book | 25.00 |
| 6 | 2 | 74 | MySQL Book | 5.00 |
+----+----------+------------+--------------+-------+
고객이 주문한 제품 목록.
송장 테이블
mysql> select * from invoice;
+----+------------+------------+---------------------+--------+-----------+
| id | company_id | invoice_no | invoice_date | amount | status_id |
+----+------------+------------+---------------------+--------+-----------+
| 7 | 2 | 123 | 2012-02-16 23:59:59 | 55.00 | 1 |
+----+------------+------------+---------------------+--------+-----------+
이곳은 송장 테이블 디자인에 상당히 얽매여 있습니다. 어떻게해야할지 모르겠습니다. 인보이스는 2 주마다 생성됩니다. 테이블 invoice.amount
에서 계산되었으므로 결과 예의 55.00입니다.orders.company_id = 2
(가) 경우 invoice.amount
-50.00 (마이너스), 그것은 평균이 회사는 나에게 수수료 금액을 보내야합니다.
(가) 경우 invoice.amount
50.00, 그것은 내가 회사에게 수수료를 보낼 필요가 의미한다.
status_id는 다음과 같습니다. (1) 송장 발송, (2) 취소, (3) 완료
테이블 에 invoice_id
필드 를 추가해야 orders
합니까? orders.invoice_id
행이 '인보이스'테이블에 삽입되면 필드를 업데이트하십시오 .
송장 지불 테이블
mysql> select * from invoice_payment;
+----+------------+-----------------+-------------+---------------------+---------------------+
| id | invoice_id | amount_received | amount_sent | date_received | date_sent |
+----+------------+-----------------+-------------+---------------------+---------------------+
| 1 | 1 | 0.00 | 55.00 | 0000-00-00 00:00:00 | 2012-02-18 22:20:53 |
+----+------------+-----------------+-------------+---------------------+---------------------+
거래를 추적하고 업데이트 할 수있는 곳입니다. 결제는 BACS를 통해 이루어집니다.
이 좋은 테이블 디자인입니까 아니면 개선해야합니까? 어떤 필드와 테이블을 추가해야합니까?
송장이 생성 된 후 나중에 테이블 orders_products
또는 orders
테이블을 변경 해야합니다. invoice.amount
필드를 다시 계산해야 합니까? (PHP / MySQL을 사용합니다).
SQL 덤프 :
CREATE TABLE IF NOT EXISTS `company` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `company` (`id`, `name`) VALUES
(1, 'Company A'),
(2, 'Company B');
CREATE TABLE IF NOT EXISTS `invoice` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`company_id` int(11) NOT NULL,
`invoice_no` int(11) NOT NULL,
`invoice_date` datetime NOT NULL,
`amount` decimal(6,2) NOT NULL,
`status_id` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
INSERT INTO `invoice` (`id`, `company_id`, `invoice_no`, `invoice_date`, `amount`, `status_id`) VALUES
(7, 2, 123, '2012-02-16 23:59:59', '55.00', 1);
CREATE TABLE IF NOT EXISTS `invoice_payment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`invoice_id` int(11) NOT NULL,
`amount_received` decimal(6,2) NOT NULL,
`amount_sent` decimal(6,2) NOT NULL,
`date_received` datetime NOT NULL,
`date_sent` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
INSERT INTO `invoice_payment` (`id`, `invoice_id`, `amount_received`, `amount_sent`, `date_received`, `date_sent`) VALUES
(1, 1, '0.00', '55.00', '0000-00-00 00:00:00', '2012-02-18 22:20:53');
CREATE TABLE IF NOT EXISTS `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`company_id` int(11) NOT NULL,
`total_cost` decimal(6,2) NOT NULL,
`order_date` datetime NOT NULL,
`status_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO `orders` (`id`, `user_id`, `company_id`, `total_cost`, `order_date`, `status_id`) VALUES
(1, 5, 2, '25.00', '2012-02-03 23:30:24', 1),
(2, 7, 2, '30.00', '2012-02-13 18:06:12', 1);
CREATE TABLE IF NOT EXISTS `orders_products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`product_name` varchar(100) NOT NULL,
`cost` decimal(6,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
INSERT INTO `orders_products` (`id`, `order_id`, `product_id`, `product_name`, `cost`) VALUES
(1, 1, 34, 'Chair', '10.00'),
(2, 1, 25, 'TV', '10.00'),
(3, 1, 27, 'Desk', '2.50'),
(4, 1, 36, 'Laptop', '2.50'),
(5, 2, 75, 'PHP Book', '25.00'),
(6, 2, 74, 'MySQL Book', '5.00');
응답을 위해 테이블을 업데이트 / 추가하려면 여기를 클릭하십시오.
감사