Mysql
在發票申請中保留總交易
我想用 MySQL 數據庫製作一個名為 Invoice Application 的應用程序。現在我設計了這個數據庫。現在我想知道這個數據庫是否適合發票應用程序。我將使用 MySQL 和 Yii 框架(php)。我在計算表中真的很困惑。在計算表中,我想儲存每張發票的總稅額、小計和總計。那麼這個 daabase 是否適用於所有這些目的,或者我應該在 InvoiceItems 表中保留總計?
第一個問題是:為什麼要儲存這些值?
通常這樣做是為了提高性能,因此您只需在進行編輯時重新計算它們。如果是這種情況,我還建議將行項目值記憶體在 ia_invoice_items 中,以便您可以
SUM
計算 ia_calculations 中的值。通常,我會在 ia_invoices 表中看到 ia_calculations 值。將它們放在自己的較小的表中會使更新速度更快一些,但是…
使用觸發器(而不是應用程式碼)管理它們還將保護您免受通過任何應用程序(包括 mysql 命令行工具等)進行的更改
還有一些你沒有要求的評論:
- 不要在你的大表中使用
INT
你id
的,例如 ia_users。改為使用UNSIGNED INT
。- 不要
INT
用於儲存日期,例如 ia_users.createtime。使用DATE
或DATETIME
代替。- 不要
INT
用於儲存布爾值,例如 ia_users.superuser。改為使用TINYINT
。- 不要
INT
在小表中用作主鍵。SMALLINT
可能是更好的選擇。- 我不會讓您的
DECIMAL
專欄的長度和精度冒險。將它們明確定義為DECIMAL(5,2)
(或您需要的任何長度)。- ia_invoices.updated_by 只允許您跟踪最近的更新。我建議使用審計系統,您可以在其中跟踪多個編輯,每個編輯都有自己的 user_id、日期時間和註釋。
- 為什麼 ia_invoice_items 中沒有 product_id?
- 不要
VARCHAR(45)
用於郵政編碼。世界上沒有人有 45 個字元的郵政編碼。由於所有客戶記錄都應該有郵政編碼,我喜歡在CHAR
這裡使用。
以下是設計發票子系統的人的一些額外想法:
- 什麼是 apply_tax1 和 apply_tax2?
- 為什麼 late_fee 是小數?為什麼要保存在發票上?您將如何跟踪更新 late_fee?津貼和收費說明,包括滯納金,通常屬於訂單。
- 您沒有訂單的概念。訂單到發票是一個非常通用的業務工作流程週期。
- 您有 payment_method,但沒有付款條款。您將如何允許買方按時付款?例如,net10、net30 等。打破這一點還可以讓您設計一個數據倉庫,您可以在其中可靠地報告買家付款拖欠情況。
- 您打算如何支持舍入?進行舍入的一般方法有兩種 - 增值稅(行項目)舍入或小計舍入。您不將發票總計儲存在發票抬頭上,也不將行項目總計儲存在行項目上,也不儲存舍入方法。
- 一些發票模式儲存數量、單位和 pricePerUnit。這在醫院計費系統中更為常見,您的藥物以 15/cc 的劑量給藥,但您以 40/cc 的劑量給藥,因此數量 = 3。
- 一旦你開始考慮訂單,請注意:訂單有自己的生命週期。它們可能僅在特定期限內有效,並且只能在特定條件下開具發票(例如,Amazon.com 在將包裹從其倉庫交給 UPS 送貨卡車時開具發票)。訂單可以被拒絕、更改或取消。