2011-06-21 42 views
0

請求書には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 Completed) またはそれ以上のステータスはありますか?

支払表

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

私は正しい道にいますか?何が改善/変更または提案できますか?

ありがとうございました。

+0

これは大丈夫です - 私は 'orders'と' invoices'の両方に 'Status'をつけるのはちょっと混乱していることをお勧めします。オーダーが請求書とは独立したステータスを持つことができれば、大丈夫です。 – Blazes

+1

元の質問にスキーマを追加していただきありがとうございます。多くの人々はしません。私はここでそれらが定義されているとは思わないので、あなたの外部キー( 'orders.userID'、' orders.InvoiceID'、 'payment.InvoiceID')をインデックスすることを忘れないでください。 – Wiseguy

+0

コストがどのように適用されるかによって、「注文」の「合計」では不十分な場合があります。あなたは 'Cost'と' Quantity'を要求するかもしれません。また、請求書に追加料金が必要な場合があります。出荷処理。言い換えれば、請求書金額は、合計注文コスト*数量+出荷+処理です。 – Blazes

答えて

2

私が追加する唯一のものは、支払いIDと支払い番号のような詳細です。このようにして、すべてのお支払いの詳細をまとめます。

+0

それはいい考えです、ありがとう。あなたが知っているように、請求書は1つ以上の注文を含むことができます。 2週間ごとに請求書を作成するにはどうすればよいでしょうか?注文をスキャンして請求書テーブルに挿入し、次に 'update' order.invoice_idを挿入するCronジョブを使用していますか? ...または注文ステータスを1(orders.status = 1)に変更した後、orders.invoice_idを更新します(請求書テーブルから最初にチェックします) –

+0

異なるスケジュールで異なるクライアントが請求される可能性がある場合次に、スケジュールを保持するクライアント設定テーブルを作成します。しかし、はい、いつも請求書を生成する必要があるかどうかを確認するために頻繁にキックオフcronジョブを使用してください。 – NotMe

+0

ありがとう@Chris Lively、あなたはOrderIDと請求書IDの両方を持つ "OrderInvoice"テーブルを持っているべきだと思いますか?だから私は注文テーブルにInvoiceIDは必要ありません。 –

0

それは私には大丈夫だ、これは私も同様にやっただろう。

ので、要件の詳細を知らなくても(私は支払いが順番にリンクされていると思うだろうが、あなたが請求書にリンクすることを意図している場合、これは結構です)

よろしく、 MN

0

とても良い。

請求書ステータスと支払いタイプのデコードをルックアップテーブルに保存して、データベースに適用され、プログラマーが正しくコーディングする必要がないようにしてください。

+0

もう少し説明します。顧客はオンラインに行き、店を選択します。彼らは特定の店から注文します。それらの順序はordersおよびorder_items表に格納されます。来月、OrderIDからインボイスを生成したいと思っています(例えば、orders.StoreID)。請求書に店が私に負っている金額や支払う必要がある金額がわかります。それはorders.totalsからすべての注文を計算する –

3

ここでは重大な問題があります。注文には複数のアイテムがあり、請求書には複数の注文があり、支払いは複数の注文と請求書に適用されることがあります。複数の請求書に注文が表示されることがあります(支払いが正常に行われなかった場合は一般的です)。

だから、必要なのはリンクテーブルです。オーダーIDと請求書IDの両方を持つORDERINVOICEテーブルから始めてください。次に、paymentidとOrder IDを持つORDERPAYMENTテーブル。

また、注文状況では、その時点で発生した注文の詳細を記録する必要があることも考慮する必要があります。これは、現在のユーザーにリンクするuser_idを持っている必要がありますが、注文時と同じように、ユーザーの名前、請求先住所、および出荷先住所を記録する必要があることを意味します。この情報は後で注文に関する質問に対処するために必要になります。さらに、オーダーの詳細を別々のORDERDETAILSという表に保管する必要があります。この表には、個別の明細、注文時の価格、注文した品目の名前が格納されています。会計上の理由からこれが必要になります。あなたは、過去の注文価格を把握するために商品表への参加を頼りにしていたことはありません。これにより、あなたの財政記録が不正確になります。

+0

提案をいただきありがとうございますHLGEM、私がはっきりと理解しているかどうかわかりません。あなたが意味するものをデータベース設計テーブルの例を投稿できますか?それから私はよく理解するだろう。ありがとう。 –

+0

私はORDERINVOICEテーブルの意味を理解しました... ORDERPAYMENTテーブルはpaymentIDとInvoiceID(OrderIDではありません)でなければなりませんか? ...詳細のユーザー名、請求先住所、製品名、および製品原価のレコードを格納する注文状況に関して - バージョン管理(タイプ2)、履歴テーブル(タイプ4)、またはデータの複製への3つのオプションがあります注文テーブル..それは良いだろうか? –

+0

請求書ではなく注文書の明細を支払うので、私はorderidとpaymentIDと言うでしょう。あなたが支払う前に私があなたに3回請求した場合、その金額は特定の請求書ではなく注文に振り込まれます。確かに3つの請求書すべてではありません。まだ支払われていない注文アイテムによって、未払いの未払いの請求書を決定することができます。アイテムのデータが注文テーブルにあることが好ましいです。それは本当に重複する情報ではありません(販売時の情報です)ので、同じ日付の2つの注文を持つことは、重複するデータではないので、もはや非正規化ではありません。 – HLGEM