2009-09-12 72 views
1

這是一個出來的新問題this question這些應該是3個SQL表還是一個?

由於答案,問題的性質改變了,所以我認爲發佈一個新的是好的(?)。

您可以在下面看到我的原始數據庫設計。我有3個表,現在我需要一個查詢來獲取run_balances計算的特定用戶的所有記錄。

  • 交易是在用戶之間,像互信。所以單位在用戶之間交換。
  • 發明是物理的東西帶進系統;一個用戶得到這個單位。
  • 消費是物質消費;用戶必須爲此支付單位。
 
|--------------------------------------------------------------------------| 
| type  | transactions  | inventarizations | consumations  | 
|--------------------------------------------------------------------------| 
| columns | date    | date    | date    | 
|   | creditor(FK user) | creditor(FK user) |     | 
|   | debitor(FK user) |     | debitor(FK user) | 
|   | service(FK service)|     |     | 
|   |      | asset(FK asset) | asset(FK asset) | 
|   | amount    | amount   | amount   | 
|   |      |     | price   | 
|--------------------------------------------------------------------------| 

(注意「量」是在不同的單元;這些是條目和計算上的那些量外製成的範圍來解釋爲什麼,但這些是字段。)。

問題是:「可以/應該在一張桌子還是多張桌子上(就像我現在有的那樣)?」我喜歡3表格解決方案,因爲它在語義上更有意義。但是,我需要這樣一個複雜的select語句(可能會有負面的性能結果),用於running_balances。在上面的鏈接中的原始問題要求這個聲明,在這裏我問是否數據庫設計是適當的(道歉四張雙重張貼,希望它沒事)。

回答

2

當您嘗試爲單一記帳實施總帳系統時,會出現同樣的問題。您稱之爲「交易」的對應於「轉賬」,例如從儲蓄到支票。你所謂的「發明」與「收入」相對應,比如存款。你稱之爲「消費品」對應於「費用」,就像你支付電費時一樣。唯一的區別是,在簿記中,所有東西都被降低到美元(或其他貨幣)的價值。所以你不必擔心識別資產,因爲一美元和另一美元一樣好。

因此,您是否需要爲「借方金額」和「貸方金額」分別設置專欄,或者您是否可以只有一列「金額」,並輸入正數和負數信用額度。如果您實施的是複式簿記而非單一記賬,基本上會出現同樣的問題。

就內部算術和內部數據處理而言,當採用單列方法時,情況會更加簡單。例如,要測試給定的交易是否處於平衡狀態,您只需要詢問總和(金額)是否等於零。

當人們需要傳統的數據輸入格式,屏幕檢索和發佈的報告時,會出現複雜情況。傳統的格式需要兩個單獨的欄,標記爲「借方」和「貸方」,它們只包含正數或空白,並且約束條件是每個項目必須有借方或貸方但不是兩個項目,而另一列必須是留空。這些轉換需要在外部格式和內部格式之間進行一定程度的編程。

這確實是一個選擇問題。保留傳統的並行借記卡和信用卡記帳形式會更好嗎?還是更有意義地採用負值的格式?有一些情況支持這些設計選擇。

就你而言,這將取決於你打算如何使用數據。我會用兩種設計中的每一種設計原型,然後開始研究每種設計的基本CRUD處理。無論哪個人在您的環境中工作更容易,都是您可以選擇的人選。

+0

Walter,您瞭解問題的真正核心 - > +1。就我而言,它更復雜,但本質上你已經掌握了它。簡而言之:我不能使用單列方法。我將這樣做:嘗試不同的解決方案,並看到最佳效果;可能在最終的易用性和性能之間會有一些折衷。 – faboolous

2

你說金額會有不同的單位,那麼我認爲你應該保留每個表本身。

我個人討厭基於存儲在一行中的實體類型填充表的「不同規則」的數據庫設計。它只是變得凌亂,而且很難將你的約束保持在這樣的桌子上。

只需創建一個索引視圖,將回答您的餘額的問題,讓您的查詢「簡單」

0

有沒有明確的答案,這和答案將在很大程度上下降到由回答者所採用的數據庫設計方法。

我的建議是試用兩種方法,看看哪一種方法在查詢,性能和維護/可用性之間有最佳折衷。

您始終可以設置一個視圖,該視圖將所有3個表格作爲查詢的一個表格返回,並且對於行涉及的過程類型具有type字段。

相關問題