2016-03-10 37 views
1

所以我正在閱讀一本關於數據庫設計原理的書,並且談到了有關繼承的一章,但是我對如何在MySQL中「連接」子類和它們的超類感到困惑?如何在MySQL中使用繼承?

表結構將,例如,像這樣enter image description here

那麼,如何將涉及這兩個子類與他們的超類,這樣我可以輕鬆地做類似的查詢到:「嘿,給我一個正確的他被分配到的人的合同類型「。

如果一個人是一名兼職兼職的學生,並且爲其學生提供資金,或者某位講師在某種程度上額外的課程(所以他是一個學生和講師)。

+0

合同可能有與學生和講師合同有關的person_id,contract_type_id。 –

+0

這不會限制一個人只能同時擁有Student_Contract或Lecturer_Contract而不是兩個? –

+0

不,不會,因爲一個人可以有多個合同。它只會限制合同本身,因爲合同必須是學生或講師類型。 – Shadow

回答

2

有多種方法可以解決這個問題;象Hibernate這樣的OR映射器實現了它們。但您也可以手動執行此操作:

  1. 最簡單的稱爲「單表繼承」。這包括使用鑑別器列,它允許您存儲類型名稱或其他類型標識符,以便能夠分離類型。這是工作,但要注意的最簡單的方法,有這些折衷:

    • 不能使用只存在於葉子類型中的一種
    • 具有很多列寬的表中的列NOT NULL約束變得更新類型更廣泛,這會降低整體性能
  2. 第二個名爲「Join Inheritance」,它反映了您的UML模型。您將有一個表「合同」,一個表「student_contract」和一個表「lecturer_contract」,每個表只保留與該類型相關的數據,而不是超類型。您將使用SQL JOIN來選擇一種特定類型的數據。 這種方法使您能夠擁有小表(快速),但隨着更多繼承(更多JOIN)的增加,複雜性也在不斷增加。核心tradedoff是:(!這反正是不好的風格)

    • 數據分配好
    • 可怕的SQL上非常複雜的繼承結構
  3. 最後一種方法是「每實體表」和這意味着您將爲每種葉片類型創建一個表格 - 在您的情況下爲「Student_Contract」和「Lecturer_Contract」。這是一個很好的方法,但要小心,還有一個折衷辦法;-)必須在所有表中安全地生成關鍵值(例如,通過使用SEQUENCE)。每個數據庫都不支持此構造(例如,mysql不支持將SEQUENCES作爲可沿多個表重複使用的構造)。

對於學術的目的,我建議你去嘗試1)簡單

起見,對於真正的項目,明智的選擇 - 我做了基於2大多數項目)

編輯:

例如,您將結束向上取決於人與合同之間的關係 - 在這樣的事情:

PERSON (1) ----- (N) PERSON_CONTRACT (N) ---- (1) CONTRACT 

(M到N的關係,如果該人可以乘法分配給合同)

PERSON (1) --------- (N) CONTRACT 

(1:N人的合同關係。合同只能有一個人,一個人可以有多個合同)

+0

這是一個簡單的解決方案太多的信息。 –

+0

我不同意,這個平臺並不打算解決其他ppls作業。僅僅是作者被要求提供一種如何找到解決方案的方法。事實上,有三種方法可以解決數據庫中的繼承問題。你的解決方案很簡單,但只匹配1/3的可能解決方案(實際上,它是數字1)在我的文本)。 – gorefest

-1

合同成板需要3個新領域:person_idcontract_typecontract_type_id

person_id INT foreign_key 
contract_type ENUM('student', 'lecturer') 
contract_type_id INT foreign_key 
1

首個解決方案:有不同的優勢ID的名稱

你讓這個問題太複雜了。解決方案是使用不同的id名稱命名每個db 。例如:

  • 爲person_id =>人
  • contract_type_id =>合同
  • student_contract_id => student_contract
  • lecturer_contract_id => lecturer_contract

二解決方案:使用SQL Joins

對數據庫進行組合來自多個表的數據的指令。

+0

只是我的2美分:你可以有分離的ID前綴,但這不是強制性的。您可以模擬Person(#ID,姓名,電話)(1) - (*)合同(#ID,...)。該關係只包含外鍵Student_Contract(#(PERSON_ID,CONTRACT_ID))。選擇通常包括表格上的JOIN。最後,你的方法是ER方法而不是OO方法。由於輸入是對象模型,因此對象模型和數據庫中的表格表示之間會存在差異。 – gorefest