舉個例子, 我有3個表:我應該在這裏使用主鍵嗎?
School: ID int, Name varchar
Student: ID int, Name varchar
StudentInSchool: StudentID int, SchoolID int
現在的問題是我是否應該把一列ID int
在StudentInSchool表上有一個主鍵?如果是,爲什麼?
會不會是在索引有幫助嗎?
任何幫助表示讚賞。
舉個例子, 我有3個表:我應該在這裏使用主鍵嗎?
School: ID int, Name varchar
Student: ID int, Name varchar
StudentInSchool: StudentID int, SchoolID int
現在的問題是我是否應該把一列ID int
在StudentInSchool表上有一個主鍵?如果是,爲什麼?
會不會是在索引有幫助嗎?
任何幫助表示讚賞。
就我個人而言,我在這樣的junction tables上創建複合PK(StudentID
和SchoolID
)。這也確保了獨特性。
但如果不是必需的獨特性,你必須添加一個ID
列唯一標識每一行。
一般來說,除了單獨ID
列的幫助不大:極少數的查詢(如有)將實際使用此列。至於性能,你可以爲每一列創建單獨的索引,你會很好。
在StudentID, SchoolID
上創建一個主鍵,在SchoolID
上創建一個二級索引,反之亦然,具體取決於更經常使用的搜索條件。
如果你的表是索引組織(ORGANIZATION INDEX
在Oracle中,CLUSTERED
在SQL Server
,InnoDB
在MySQL
),然後二級索引將有一個PRIMARY KEY
作爲最左邊的部分,因此,所有的信息可以獲取列的索引。
答案是,這取決於。在大多數情況下,答案是「否」:(StudentID, SchoolID)
的複合主鍵就足夠了。
但是,如果該交點表開始獲取其他相關數據(比如加入日期,離開日期)和/或它成爲相關表格的父項(例如出席記錄),那麼您可能需要或需要將其視爲定期表。在這種情況下,(StudentID, SchoolID)
成爲商業密鑰(即仍然是唯一的),並添加Id或其他合成(或代理)主鍵。
就純數據完整性而言:無。將主鍵定義爲(StudentID,SchoolID)是完全足夠的。
但是,你不說你正在使用的RDBMS。可能對於其中的一些,單個ID列會導致更高效的查詢計劃。
在SQL Server的情況下,兩個整數的組合主鍵是非常有效的,並且沒有進一步的索引應在兩列是必需的。
在這個例子中,除非StudentInSchool表格要具有其他屬性,例如,學生在該學校應對動作時的時間戳,我不會使用它,我會將schoolID字段放在Student表中,並將其定義爲外鍵。
但是,如果這是設計,那麼是的,通過在StudentInSchool表上放置一個主鍵,你不會失去任何東西。
您可以結合StudentID和SchoolID一個主鍵。
描述何時使用索引有一些通用規則。當 處理相對較小的表時, 索引不會提高性能。在 中,一般索引在表連接中使用的 字段上創建時提高了性能 。使用索引時,數據庫查詢的大多數 檢索 相對較小的數據集,因爲如果 大多數時間您的查詢檢索大部分數據 ,索引將 實際上減慢數據檢索。使用 索引用於具有許多不同值的列(列中不存在多個重複值)。 儘管索引提高了搜索效果,但它們減慢了更新速度, ,這可能是值得 考慮的事情。
來源:SQL Indexes
好吧,我覺得有東西在分配丟失,所以我會與我的現實世界的知識貧乏嘗試:O)
什麼是學生?他們上學,他們可能在一所以上的學校(尤其是大學)學習,他們甚至可能會在以後再學同一所學校等。
交叉表原樣(在兩個ID上都有PK)足夠多模擬這些關係?
簡短的回答:沒有
長的答案:還沒有,但對於簡單的情況下,子集就足夠了(你是他們中的一個?)。
如果您想在所有這些情況下延遲db,則需要代理PK(您的ID)。如果我只是懷疑它可能是必需的,我會把ID放在那裏(因爲沒有太多可能會丟失)。
正如第一句所述 - 正確答案是:「我們不知道」,因爲缺少應用程序的要求和上下文。
+1。我採用相同的方法 – Alex 2010-01-22 10:29:52
取決於我們想要使用聯結表來描述的關係的基數。當我們嘗試建模現實世界時,強制一對一關係可能會適得其反。 – 2010-01-22 10:31:18