0

我正在创建一个将客户付款存储在数据库中的程序。

可以为一种产品多次付款,但我不想为客户进行的每次付款创建单独的列。

我想过通过在每次付款后添加一个新列来使列数可变,但这对我来说似乎是一个糟糕的解决方案......

有什么建议么 ?

我认为该表应如下所示:

ID    ClientID   ProductID   Payment????.....
4

4 回答 4

3

您应该创建一个单独的表,Payments然后您可以为每个订单进行多次付款。与此类似:

create table payments
( 
   paymentid int,
   paymentamount int,
   orderid int,
   paymentType varchar(50)
)

create table orders
(
   orderid int,
   customerid int,
)

create table customers
(
  customerid int,
  customername varchar(10)
)

create table orderdetails
(
  orderid int,
  productid int
)

create table products
(
  productid int,
  productname varchar
)

以这样的方式进行设置将允许您为每个订单进行多次付款。

然后你的查询将是:

select *
from customers c
left join orders o
  on c.customerid = o.customerid
left join orderdetails od
  on o.orderid = od.orderid
left join products p
  on od.productid = p.productid
left join payments ps
  on o.orderid = ps.orderid
于 2012-12-20T21:23:51.817 回答
2

如评论中所述,您应该有一个链接到用户表的付款表。

Customer
{
  ID,
  Name etc...

}

Payment
{
   Amount
   CustomerId, (foreign key to customer table)
   ProductId,
   etc...
}

然后查看客户支付的款项:

Select * 
From Customer 
Inner join Payment on Customer.Id = Payment.CustomerId
where customer.id == ?
于 2012-12-20T21:25:20.313 回答
0

我认为可能有必要跟踪每笔单独的付款。从技术角度来看,它会让你的生活变得更加简单,在现实生活中的交易中,它可能是必需的。

于 2012-12-20T21:22:45.683 回答
0

产品销售场景的典型数据库规范化如下:

Table: Product
(pkey) ProductID
BarCode
ProductName
Price
etc... (product description, and stuff)

Table: InvoiceItem
(pkey) InvoiceItemID
(pkey) InvoiceID
(fkey) ProductID
Quantity

Table: Invoice
(pkey) InvoiceID
*some people like InvoiceTotal here, but then you end up with multiple authorities for the total of the invoice, I prefer to derive the InvoiceTotal from the sum of InvoiceItems*

Table: Payments
(pkey) PaymentID
(fkey) InvoiceID
PaymentAmount

PKEY 指的是表中行的主键。FKEY 是指与另一个实体的外键关系。

最后(当您加入所有这些时),您最终会得到一个垂直表,其中包含一个包含一个或多个付款的单个发票,不同列中的贷方和借记。这允许一张发票在同一总数上包含多个产品,并允许将多个付款应用于同一张发票。如上所述,动态添加列将比其他任何事情都更令人困惑。关系数据库设计都是关于一组已知的列,将数据连接到未知数量的行上。

于 2012-12-20T21:44:23.260 回答