【问题标题】:Recommended table schema for customer accounts table?客户帐户表的推荐表架构?
【发布时间】:2012-06-01 22:45:43
【问题描述】:

我想为一个包含客户及其费用和付款的系统创建一个数据库模式。推荐的方法是什么,以便我稍后可以仅使用一个查询获得所有客户的列表以及他们的总费用和付款?

单个查询应返回如下结果:

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

哪种方法最好?

【问题讨论】:

  • 可以在单个查询中使用第三种方法获得所需的输出。如果您还需要获得总金额(所有费用减去所有付款),第三种方法将是最灵活的解决方案。

标签: sql database


【解决方案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 )

【讨论】:

【解决方案2】:

您的第一种方法是正确的解决方案。

检索数据的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

【讨论】:

    【解决方案3】:

    在所有 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
    

    【讨论】:

      【解决方案4】:

      您应该使用第一种方法,将费用和付款分成两个单独的组。

      它们具有不同的特征。例如,付款可能具有付款方式、要申请的费用(可能在单独的表中以处理多项费用的付款)、是否为部分费用等等。

      费用可能会有不同的信息,例如计费日期等。

      正如其他人所指出的,您可以将来自多个表的结果合并到一个查询中。然而,这一事实与如何设计数据库模式的问题完全不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多