2011-11-20 45 views
1

我有點猶豫不決關於某個特定數據庫表結構,這裏的情景:數據庫表設計的問題(簡單)

我有一個「發票」表,發票可以作爲一個「產品」或對於「服務」(產品在桌子上,服務在單獨的桌子上)。

將發票鏈接到其中任何一種方式的最佳方式是什麼,還允許添加更多選項?如果它是唯一的一個產品的發票,該表的設計是:

id, product_id, amount 

但什麼是此方案的最佳方式?我在想這樣的事:

id, source_id, invoice_type (product or service), amount 

但我認爲這可能不是一個好主意。

回答

2

如果productservice發票之間沒有任何差異,只需使用一個表和invoice_type字段。


在閱讀完整個問題後,您在最後列出的內容是正確的。你應該看看的是subclass和超類的例子。

基本上,所有相同的字段可以分組到一個表中,那麼只有屬於特定類型服務的字段可以分組到它自己的表中。而不是有1或2個表格,你最終會得到最多3個(需要的超類和2個子類),並且它們會更規範化。


鑑於你的榜樣(注:這只是一個例子)

  • 超類:發票

    id, invoice_type (product or service), amount, invoice_dt, customer_paid 
    
  • 子類:產品

    invoice_id, msrp, cost, purchase_dt 
    
  • 子類:服務

    invoice_id, duration, extraneous_cost, start_dt, end_dt 
    
+0

+1畢竟如果以後開始找東西所特有的服務發票,說是「特殊服務稅」,你可以添加一個invoice_service_detail tableor的東西,有根據需要INVOICE_ID,然後等領域(加上它自己的ID當然)。 –

+0

(更新後)是vol7ron的方式更靈活,可擴展,烘乾機等,哪種方法取 - 1代額外的表明確表將取決於你的需要/。如果它是ORM基於Web的系統的一部分,則可以使用一個表,但是會分離從中派生出的對象。 –

+0

是的,我會想相同的,但數據是完全一樣的,唯一的區別是類型...所以1臺似乎是一個更好的option..but我當時想,如果我想錶鏈接到一個使用外鍵父表,我不能這樣做,(如果我沒有記錯的話)......因爲我使用它在不同的情況下,可以參照不同的表相同指數... –

1

的發票可以參考很多產品或服務。

產品可以出現在很多發票上,因爲許多人可以購買同一產品。

但服務怎麼樣?如果您將其視爲與產品相同,那麼您需要兩者之間的多對多表。

我想辯論是否需要產品和服務的父表。確保模型中兩者之間存在真正的重要區別。

就我個人而言,我認爲兩個表都比較簡單。我會一直這樣做,直到我有明確的理由來區分它們。

+0

我同意,但我想實現一個外鍵,但在這種情況下,它變得不可能(我認爲?),因爲我有相同的索引,每次指的是不同的父表...那麼你會提出什麼建議? –

+1

不,不是不可能的。您需要一個帶有主鍵和類型列的父表。 PRODUCT和SERVICE表將對其各自的父記錄有一個外鍵。 – duffymo