2012-06-01 29 views
1

我想爲持有客戶以及他們所做的收費和支付的系統創建數據庫模式。什麼是推薦的方法,以便我稍後可以僅使用一個查詢來獲得所有客戶的全部費用和付款清單?客戶賬戶表的推薦表格模式?

一個查詢應返回結果是這樣的:

NAME | TotalCharges | TotalPayments 
John   80    100 
Nick   100    90 

我想創建兩個單獨的表,一個是收費,一個用於付款。

CUSTOMERS 
-ID 
-NAME 

CHARGES 
-ID 
-CUSTOMER_ID 
-AMOUNT 

PAYMENTS 
-ID 
-CUSTOMER_ID 
-AMOUNT 

另一種方法是創建一個表,兩個收費和支付,使用一列每個,像這樣:

CUSTOMERS 
-ID 
-NAME 

CHARGES_AND_PAYMENTS 
-ID 
-CUSTOMER_ID 
-CHARGE_AMOUNT 
-PAYMENT_AMOUNT 

另一種方法是使用一個表兩種費用及付款,使用一個TRANSACTION_TYPE標誌。 0->付款,1->充電,但如果我用這個方法,我將無法得到使用一個查詢客戶的總費用及付款(或可以嗎?)

CUSTOMERS 
-ID 
-NAME 

CHARGES_AND_PAYMENTS 
-ID 
-CUSTOMER_ID 
-TRANSACTION_TYPE (Flag: 0=Payment, 1=Charge) 
-AMOUNT 

這是最好的進場?

+0

您可以在單個查詢中使用第三種方法獲得所需的輸出。如果您還需要總額(所有費用減去所有付款),第三種方法將是最靈活的解決方案。 –

回答

1

請在每個客戶ID

select Customers.Name 
, Customers.id 
, (select sum(Charges.Amount) 
     from Charges 
     where CustomerId = Customers.id) 
, (select sum(Payments.Amount) 
     from Payments 
     where CustomerId = Customers.id) 
+0

請謹慎使用嵌套選擇。所有的人都會建議避免它。是slooow:http://www.selikoff.net/2008/12/10/memo-avoid-nested-queries-in-mysql-at-all-costs/。 – danihp

1

您的第一種方法是正確的解決方案。

SQL查詢檢索數據將是:

select 
    CUSTOMERS.ID, CUSTOMERS.Name, 
    sum(CHARGES.AMOUNT) as total_CHARGES_amount, 
    sum(PAYMENTS.AMOUNT) as total_PAYMENTS_amount 
from 
    CUSTOMERS 
    left outer join 
    CHARGES on CUSTOMERS.ID = CHARGES.CUSTOMER_ID 
    left outer join 
    PAYMENTS on CUSTOMERS.ID = PAYMENTS.CUSTOMER_ID 
group by 
    CUSTOMERS.ID, CUSTOMERS.Name 
1

在所有3種方法的費用和支付表的總和,你可以用一個單一的獲取數據查詢,但我會推薦第一種方法,因爲您的數據將根據實體進行適當組織。並且您的單個查詢將如下所示:

Select C.Name, SUM(CH.AMOUNT) AS CHARGES, SUM(P.AMOUNT) AS PAYMENTS 
FROM CUSTOMERS C 
LEFT JOIN CHARGES CH ON C.ID = CH.CUSTOMER_ID 
LEFT JOIN PAYMENTS P ON C.ID = P.CUSTOMER_ID 
WHERE C.ID = @CustomerId 
GROUP BY C.Name 
1

您應該使用第一種方法,將費用和付款分爲兩個單獨的組。

這些有不同的特點。例如,付款可能有付款方式,適用於付費的付款方式(可能在單獨的表格中處理多筆付款),是否收取部分費用等等。

收費可能會有不同的信息,如開票日期等。

正如其他人所指出的,您可以將來自多個表格的結果合併爲一個查詢。但是,這個事實與如何設計數據庫模式的問題是完全分離的。