2017-07-29 86 views
1

我有一個有點獨特的情況在這裏,我有3個型號:Degree,StudentConsultant創建屬於許多關係,超過2個模型envolved

學生和顧問之間有多對多的關係。
此外,學位和學生之間還有多對多的關係。

我可以爲上述關係中的每一個設置2個數據透視表,
但是這裏重要的是:一個具體學位的學生可以有1位顧問。
換句話說,創建2個單獨的數據透視表,並不能告訴我哪位顧問對於特定用戶的程度如何。

在這裏我可以想到的2個解決方案:

第一個是創建一個數據透視表3個的外鍵,如:

student_id | degree_id | consultant_id 

這樣我可以知道誰是學生的顧問,爲特定的度。

但是,這是一種構建數據庫的標準方式嗎?
另外,我應該爲此創建一個Pivot模型嗎?
代碼段會是什麼樣子?

另一種方法我能想到的是,創建2代獨立的樞軸表的,並在其它一個引用一個透視表id
因此,這看起來就像是這樣的:
degree_student:student_id | degree_id
consultant_student:student_id | consultant_id | **degree_student_id**

再次,這是一個標準的做法?
我應該爲此創建一個Pivot模型嗎?

進行最後討論,我會接受任何其他解決方案建議,更好(/標準)。

注意:我檢查了herehere,但無法滿足我的要求。

回答

0

在一個特定程度的學生可以有1名顧問

你的第一個設計並不強制。 student_id可能與degree_student的student_id不同。對於degree_student_id,可能有多個consultant_id。此外,consultant_id必須是空。

你的第一個設計類似:

--  student student_id is in degree degree_id witout a consultant 
-- AND consultant_id IS NULL 
-- OR student student_id is in degree degree_id with consultant consultant_id 
consultant_degree_student: degree_id | student_id | consultant_id 
(composite) PK (primary key) (degree_id, student_id) 
nullable consultant_id 

類似於您的第二個設計(即有一個隱degree_student_id場):

-- degree_student_id identifies student student_id being in degree degree_id 
degree_student: degree_student_id | degree_id | student_id 

--  degree_student_id identifies student student_id being in degree degree_id 
-- AND student student_id is in degree degree_id with consultant consultant_id 
degree_student_consultant: degree_student_id | consultant_id 

那些沒有多餘的ID &無可空場類似:

-- student student_id is in degree degree_id 
degree_student: degree_id | student_id 

-- student student_id is in degree degree_id with consultant consultant_id 
consultant_degree_student: degree_id | student_id | consultant_id 
PK (primary key) (degree_id, student_id) 

複合PK暗示有c只有一個記錄與給定的(degree_id, student_id)對,所以consultant_id是每對單值。規範化正好告訴我們這些表沒有問題可以解決。

你必須在邏輯上權衡表的數量,ID的數量,空表的含義& simplcity /複雜性(謂詞),與其他事物的物理性能一起。典型的SQL設計將使用1st。您需要查找&關注信息建模&關係數據庫設計。 (PS根本不是「獨特的情況」。)

相關問題