2011-06-09 406 views
0

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

一张发票包括许多订单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表necessarry?

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

+0

可能重复[发票从多个订单?](http://stackoverflow.com/questions/6278061/invoice-from-multiple-orders) – 2011-06-09 14:02:01

+1

我看到太多'发票设计'问题的最后几天... – 2011-06-09 14:02:33

+3

@ypercube,如果那些辅助教员代表他们所有的学生发布一次问题,这将节省时间。 – 2011-06-09 14:10:19

回答

1

您需要链接表。订单可以在多张发票中(如果他们没有付款!),并且发票可以包含许多订单。在链接表中,尽管我不打扰invoice_order_id(PK)。 PK是两个FK字段的组合。这保证了唯一性,并且由于您不太可能拥有链接表的子表,因此通过向其添加代理键确实没有任何好处。即使你在加入两个索引的int字段之间的性能差异可能会忽略不计。

3

你只需要invoice_order表,如果:

  • 一个订单可以有一个或多个发票

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

By your sugge在问题结束时,情况就是如此。您不应该只有invoice_id,并在新发票发布时更新它,因为您将失去订单与以前发票之间的链接。

更新

顺便说一句,这是很好的,你有costitem_name为了项目,这是一件好事初学者往往会发现很奇怪。您必须出于历史原因才能拥有这些产品,并且可以用相同的数据重新打印订单,比如3年后,该产品的名称可能稍有变化,成本肯定会更新。

+0

谢谢艾德里安,你建议我应该怎么做?发票可以有很多订单,但..发票不能有多个相同的订单。 (在我的问题最后提出的建议不是很好的解决方案?) – 2011-06-09 14:08:25

+0

这是否意味着订单只能链接到一张发票​​?如果是这样,为什么你提到'order.invoice_id'更新? – 2011-06-09 14:10:10

+0

对不起,我的意思是一张发票可以是一个或多个订单。那么有invoice_order表是好的吗? – 2011-06-09 14:39:14

-1

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

顺便说一句,没有看到您的表中的任何CustomerId!

+0

这将是表现最差的解决方案。泛化在数据库设计中通常是一个非常糟糕的主意。 – HLGEM 2011-06-09 14:39:23

+0

@hlgem:这是你的意见。我使用这个方案取得了成功的实现,我知道我的建议是完美的。 – 2011-06-09 14:46:16

+0

@HLGEM:“泛化通常是一个非常糟糕的主意”......事实上,你的句子是一个不好的概括。 – 2011-06-09 14:52:09

1

大多数发票将有:

  • 客户ID
  • 销售代表ID
  • 付款方法
  • 船到地址
  • 帐单地址
  • 复选框:SHIPTO相同的计费
+0

那不回答我的问题,谢谢, – 2011-06-09 14:33:47

+1

好的。您的问题:这张发票表是否设计正确?我的答案:不。 – 2011-06-09 16:56:16