会社は毎月 1 日と 16 日に請求書を受け取ります。(これは 2 週間ごとに Cron ジョブを介して実行されます。注文テーブルをスキャンしてから、「請求書」テーブルに追加します。代替手段はありますか?)
テーブルには顧客の注文のリストがあり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 |
+----+---------+------------+------------+---------------------+-----------+
2 人の顧客が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
表から計算したため
が -50.00 (マイナス)の場合、invoice.amount
会社が私に手数料の額を送る必要があることを意味します。
invoice.amount
が 50.00の場合、会社に料金を送金する必要があることを意味します。
status_id は、(1) 請求書送信済み、(2) キャンセル済み、(3) 完了済みのいずれかです。
テーブルにinvoice_id
フィールドを追加する必要がありますか? 行が「invoice」テーブルに挿入され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');
Answer here にテーブルを更新/追加してください。
ありがとう