2011-06-09 404 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