我正在创建一个将客户付款存储在数据库中的程序。
一种产品可以多次支付,但我不想为客户的每笔付款创建单独的列。
我考虑过在每笔付款后添加一个新的列来改变列数,但这对我来说似乎是一个糟糕的解决方案......
有什么建议吗?
我觉得这个表应该是这样的:
ID ClientID ProductID Payment????.....
答案 0 :(得分: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
答案 1 :(得分: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 == ?
答案 2 :(得分:0)
我认为可能有必要跟踪每笔单独的付款。从技术角度来看,它将使您的生活更加简单,在现实生活中的交易中,它可能是必需品。
答案 3 :(得分: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指的是与另一个实体的外键关系。
最后(当你加入所有这些时),你将得到一个垂直表格,其中包含一个带有一个或多个付款的发票,其中包含不同列中的信用和订单。这允许发票具有相同总额的多个产品,并允许将多个付款应用于同一发票。如上所述,动态添加列将比其他任何事情更令人困惑。关系数据库设计是关于一组已知的列,它们连接未知行数的数据。