发票表设计

时间:2011-06-09 13:55:20

标签: mysql sql database database-design

我想知道如何设计发票表。

发票包含来自order表的多个订单。

此发票表是否设计正确?

顺序

  • order_id(PK)
  • User_id(FK)
  • TOTAL_COST
  • order_date的
  • 状态

order_item

  • order_item_id(PK)
  • order_id(FK)
  • ITEM_NAME
  • 成本

发票表

  • invoice_id(PK)
  • invoice_no
  • invoice_date
  • period_start_date
  • period_end_date
  • 状态

invoice_order (包含多个订单的发票)

  • invoice_order_id(PK)
  • invoice_id(FK)
  • order_id(FK)

invoice_order表是否必要?

我可以在order_table中添加invoice_id(FK)字段。当我在发票表中添加一行时,“订单.trind_id”将会更新。

4 个答案:

答案 0 :(得分:3)

如果出现以下情况,您只需要invoice_order表格。

  • 订单可以包含一张或多张发票

  • 发票可以链接到一个或多个订单

根据您在问题末尾的建议,就是这种情况。您不应该只有invoice_id并在新发票进入时更新它,因为您将丢失订单与之前发票之间的链接。

<强>更新

顺便说一句,你在订单项中有costitem_name是件好事,这是初学者往往会发现奇怪的东西。您必须出于历史原因而拥有这些数据,并且可以使用相同的数据重新打印订单,例如,3年后,当项目的名称稍有变化且成本肯定已更新时。

答案 1 :(得分:1)

大多数发票都有:

  • 客户ID
  • 销售代表ID
  • 付款方式
  • 送货地址
  • 结算地址
  • CheckBox:Shipto与结算相同

答案 2 :(得分:1)

您需要链接表。订单可以是多个发票(如果他们没有付款!),发票可以包含许多订单。在链接表中虽然我不打扰•invoice_order_id(PK)。 PK是两个FK字段的组合。这保证了唯一性,因为你不太可能有链接表的子表,所以通过添加代理键实际上没有任何好处。即使你在连接两个索引的int字段之间做了性能差异,也可以忽略不计。

答案 3 :(得分:-1)

概括!!您应该考虑将其减少到2个表:Documents和DocDetails。只需在“文档”表中添加DocType字段,即可将订单与发票区分开来 如果您需要跟踪延期交货,请在您的DocDetails中添加一个链接字段 添加订单明细行时,请在“链接”字段中输入表PK(计数器)的值 添加发票明细行时,请为链接指定与相关订单明细相同的值。

顺便说一下,你的桌子上没有看到任何CustomerId!