2011-12-28 212 views
3

我前幾天創建了一個處理髮票的應用程序。我想知道如何最好地將折扣與我的發票相結合。我應該將其作爲負項目(在invoice_items表中)還是應在發票表中創建「折扣」列?發票數據庫設計

+0

什麼這些選擇對你來說會有什麼後果?例如,您想要多次折扣還是以後特別打折? – Pelshoff 2011-12-28 20:13:21

+0

感謝您的快速回復。每張發票只會有一個折扣。 – redmoon7777 2011-12-28 20:25:18

+1

如果每張發票只有一個折扣,那麼我不會讓它變得比需要更復雜。 – Pelshoff 2011-12-28 20:27:19

回答

6

我將它作爲一個負值項目。原因是:

  • 隨着開具發票,這是非常重要的是,計算值永遠保持永恆;即使您的計算公式稍後發生變化,您也可以正確複製任何給定的發票。如果這個值是不正確的在這個時候計算出來的 - 這是真的。
  • 具有值量意味着對於特殊情況下手動調整很容易處理 - 例如,你的營銷經理/會計師可能決定放棄,因爲延遲交貨的100 $一折的折扣。這是微不足道的價值 - 只需增加一行,但很難/打折折扣
  • 您可以有多個折扣金額每張發票
  • 它是完全靈活的 - 它有自己的空間來存在和無論它需要是。事實上,我會做折扣的另一個「副產品」(甚至多個產品 - 一個爲每個不同的折扣原因,如聖誕節,優惠券,轉診等
  • 憑藉自己的項目,你可以添加一個原因說明就像任何其他「產品」 - 如:或什麼
  • 你不需要任何特殊代碼或數據庫列「現金支付10%的折扣」就總筆數達和以前一樣把它們打印在發票上「沒有勺子(折扣)「:?這只是一個行項目 - 什麼比這更簡單的比需要的任何代碼/ DB變化
  • 並非所有的項目應該被忽略 - 如退款,退貨,訂閱(如果適用)它變得太複雜,沒有必要在數據庫中表示折扣的商業邏輯,保留計算等在應用程序代碼中,將結果存儲在分區中擁有自己的項目意味着計算可以任意複雜。這意味着隨着複雜性的增長,不需要維護數據庫。這一大堆的更易於維護/修改代碼比它是維持/改變數據庫
  • 最後,我成功地建立了一個進銷存系統,我就拿「項目」的方式,它真的很好
+2

+1,但只是只是。這裏提出了很多優點,但我不確定我是否同意整個結論。這可能取決於開具發票的行業。發票的穩定性是一個關鍵點;這可能會通過確保價格數據(尤其是產品描述等)在發票時刻準確無誤(可能通過將相關數據從產品表中複製到發票項目表中)或類似的東西來處理)。對於諸如一次性100美元折扣之類的東西,具有「特殊產品代碼」是可以的。 [...繼續...] – 2012-01-01 02:50:07

+0

[...延續...]但是,我認爲僅僅通過特殊項目來處理折扣是錯誤的;該項目通常有折扣,並且可以與項目一起記錄爲百分比或金額。如果有整體折扣,可以用主發票記錄。在這兩種情況下,都不需要NULL來記錄沒有折扣;零值通常是合適的默認值(除非確實是列表價格是例外)。 – 2012-01-01 02:52:58

+0

@JonathanLeffler你提出了很好的觀點。如果有很多折扣,那麼也許你是對的。然而,當列被定義但很少使用,即當折扣不是標準時,最終會得到「稀疏」數據,這對我來說是一個「紅旗」設計。 – Bohemian 2012-01-01 10:05:39

2

這些選擇對你來說會有什麼後果?例如,您想要多次折扣還是以後特別打折?如果每張發票只有一個折扣,那麼我不會讓它變得比需要更復雜。在我看來,將它放在發票表中會更容易和更清楚 - 我認爲,將其作爲負項目會使物品的處理更加困難。

+1

我同意你的答案,當客戶決定他可能想要多次折扣時,我即將這樣做。因此我必須使用項目方法。 – redmoon7777 2012-01-02 04:22:47

+0

很好,你問這個問題,做得好:) – Pelshoff 2012-01-02 19:05:03

2

我使其儘可能簡單完全同意,但有一點要考慮的是,如果任何項目應該從折扣免徵?在這種情況下,您需要在細節中添加一個布爾字段來記住哪一行應該有折扣。