2012-04-18 58 views
2

我有以下數據庫,第一個表用戶是包含我的用戶的表,userid是主鍵。以下是可接受的外鍵使用情況

user table

下一個是我的成績表,現在對於每個用戶,可以有一個id的結果,它可以是針對考試。在這種情況下可以使用「id」作爲主鍵,「userid」作爲外鍵嗎?有沒有更好的方法可以模擬這種情況?

results table

這些然後鏈接到相應的考試...

enter image description here

回答

2

我可能沒有userid作爲varchar。我也會把它當作int

因此,用戶表是這樣的:

userId int 
userName varchar 
firstName varchar 
lastName varchar 

然後在結果表表forenkey將是一個int。就像這樣:

userId int 
result varchar 
id int 
examid INT 

監守如果你是普蘭上JOIN荷蘭國際集團的表在一起,然後JOIN荷蘭國際集團在varchar是不一樣快JOIN荷蘭國際集團在INT

編輯

依賴您計劃存儲多少數據。因爲你知道有一個最低限度的chans GUID s不是唯一的。 Simple proof that GUID is not unique。我想如果我設計這個數據庫,我會用一個int。因爲使用GUID作爲用戶有點矯枉過正

+0

我實際上正在考慮使用GUID作爲用戶的主鍵,而不是int。這是一個壞主意嗎? – david99world 2012-04-18 11:29:31

+0

已更新答案 – Arion 2012-04-18 11:35:46

+2

@ david99world:記得投票選出你認爲很好的答案。這給了我們所有溫暖的模糊感覺:P – Arion 2012-04-19 08:44:39

1

規定,每個用戶/考試將只產生一個結果,那麼你可以使用創建複合鍵結果表中的useridexam列。

就個人而言,我會採用任意的id字段方法,因爲我不喜歡必須將多個值傳遞給引用記錄。但那只是我:)。

另外,結果表中的exam字段也應該是外鍵。

+0

我也建議改名考試外鍵字段在結果表「examid」保持一致的命名。 – weenoid 2012-04-18 10:57:07

1

這樣做的另一種方法是從考試中抽取成績水平,並將考試作爲自己的表上的唯一實體(和主鍵) 。因此,這會生成一個成績等級表(pkey1 = A,pkey2 = B等),其中成績在您的第二個表中作爲外鍵,從而刪除整個字段。

您也可以正常出另一級別併爲主題創建一個表格,這將成爲專用考試代碼表的外鍵。你可以有ENG101,ENG102等進行考試,其他考試代碼也一樣。這樣做的好處是將您的考試,科目,學生和年級保持爲獨特的實體。每一個的主鍵和外鍵都很明顯,並且您可以保留一個簡單的維護未來,並有擴展空間。

你可以考慮使用組合鍵,但是這是開始一個很好的和簡單的方法,並且可以根據需要合併表進行索引和壓實。

1

請確保你真正的正常化架構之前先了解Normal Forms

+0

好的,所以我應該將結果表中的值拆分成單獨的表格以具有第一範式。 – david99world 2012-04-18 13:46:42

相關問題