Mysql 有销售来源、订单或无订单的付款表

Mysql 有销售来源、订单或无订单的付款表,mysql,sql,foreign-keys,Mysql,Sql,Foreign Keys,组织此付款表的最佳方式是: 现在这是我的付款表: 付款表 PaymentID(主键) 类型(枚举->订单、销售、付款) 订单id(与订单表相关) 销售标识(与销售表相关) 例如: PaymentID | Type | Order_id | Sale_id 1 | Sale | NULL | 3 2 | Order | 2 | NULL 3 | Payment | NULL | NULL

组织此付款表的最佳方式是:

现在这是我的付款表:

付款表

  • PaymentID(主键)
  • 类型(枚举->订单、销售、付款)
  • 订单id(与订单表相关)
  • 销售标识(与销售表相关)
例如:

PaymentID | Type    | Order_id | Sale_id
1         | Sale    | NULL     | 3
2         | Order   | 2        | NULL
3         | Payment | NULL     | NULL         << In this case, it references itself
PaymentID |类型|订单|销售| id
1 |出售|无效| 3
2 |命令| 2 |无效

3 | Payment | NULL | NULL假设
id
s都具有相同的类型,则您的结构是冗余的。尽管如此,你的可能还不错。还有其他选择:

你可以做:

PaymentID (primary key)
Type (ENUM -> Order, Sale, Payment)
relatedto_id
缺点是您没有正确的外键关系。好处是您可以添加新类型,而无需更改表的结构。而且记录更小

您还可以为每种类型设置单独的id:

PaymentID (primary key)
Order_id (related to Orders table)
Sale_id (related to Sales table)
然后,您可以通过使用视图访问表来插补类型。缺点是添加新类型需要修改表,并且必须输入类型。好处是外键对齐


你的结构很好。但是,使用MySQL的一个缺点是,您无法轻松地在表上强制执行使列一致的约束(因此一种“order”类型将始终具有非null的order\u id
)。

我建议您的设计是不完整的。考虑:


  • 当一笔付款适用于多个订单时,您将怎么做
  • 那么只适用于订单一部分的付款呢
  • 如果您有一个部分付款,然后是一个适用于该部分付款订单和其他三个订单的付款,该怎么办
付款和订单之间的关系需要在一个单独的表中,如“PaymentAllocation”,以便您可以处理任何可能的分配。还考虑到人们不支付订单,他们支付发票可能包含多个订单,而你根本不建模(除非“销售”是真正的“发票”)< /P> 您至少需要:

Order (Order Id, other order data)
Payment (Payment Id, other payment data independent of sale or order)
Sale (Sale Id, I'll assume this is really "Invoice")
PaymentAllocation(PaymentId, SaleId, AmountAllocated)
注意,没有向订单分配付款。付款分配给销售(发票)


这只是一个粗略的框架,让您思考如何对账单和收款的实际情况进行建模。

当一笔付款应用于多个订单时,您将怎么做;仅适用于订单一部分的付款如何;如果您有一个部分付款,然后是一个适用于该部分付款订单和其他三个订单的付款,该怎么办?付款和订单之间的关系需要在一个单独的表中,如“PaymentAllocation”,以便您可以处理任何可能的分配。还要考虑人们不支付订单,他们支付发票可能包含多个订单,你根本不建模。第一个选择是好的,但我不能使用,因为外键关系。谢谢,兄弟。哦,我知道了关于部分付款,然后是一个适用于部分付款订单和其他三个。。在我的应用程序中,我想做一个总数,如果总数等于订单价格,那么它就被支付了。