2010-05-19 73 views
8

是否有官方指導或閾值來指示在MySQL數據庫中使用外鍵的最佳實踐?何時在MySQL中使用外鍵

假設您爲電影創建了一張表。一種方法是將生產者和導演數據整合到同一張表中。 (movieID,movieName,directorName,producerName)。

但是,假設大多數導演和製片人都參與過很多電影。最好是爲製作人和導演創建另外兩張表,並在電影表中使用外鍵?

什麼時候成爲最佳做法?當許多導演和製作人在專欄中出現過幾次?或者最好在開始時採用外鍵方法?雖然使用外鍵似乎更有效,但它也會增加數據庫的複雜性。

那麼複雜性和規範化之間的權衡何時變得值得呢?我不確定是否有閾值或特定數量的單元重複使得使用外鍵更明智。

我在想數據庫會被數百個用戶使用,很多人同時使用。

非常感謝!

回答

11

這裏有一些官方的指導方針。他們被稱爲正常形式,並把你的數據庫進入他們的做法稱爲規範化:http://en.wikipedia.org/wiki/Database_normalization

如果你在大學採取db類,他們可能會教你3nf或bcnf。我總是發現這些方法有點笨手笨腳,但我有足夠的分貝設計經驗,我發現這些問題基本上是直觀的在這一點上...

在你的例子中,你絕對想要使用外鍵約束。多對一的關係最好用這種方式表達。它會使選擇電影慢一些,因爲你必須在'人'桌子和'電影'桌子上進行連接 - 根據電影桌子有多少'人'字段可能會有許多連接。

但優點是你可以輕鬆管理自己的人。如果你想改變人名的拼寫,你不必在每個字段中掃描整個表尋找那個人。你可以避免在db中多次使用同一個人,而在拼寫方面略有不同。你可以設置一個人被刪除時要採取的行動。你可以很容易地計算出一個人有多少不同的角色。

別忘了,如果你想使用外鍵,你必須讓你的表innodb在mysql中。

+1

好帖子。不過要清楚的是,你可以在MyISAM中實現外鍵。他們不會被強制執行***。 – webbiedave 2010-05-19 21:18:59

4

假設您爲 電影創建了一張表。一種方法是將 將生產者和導演 數據集成到同一個表中。 (movieID, movieName,directorName, producerName)。

這太不規範了。你正在重複數據。

不過,假設大多數導演和製片人都在製作很多電影。 是否最好爲製片人和導演創建另外兩張 表, 並在電影 表中使用外鍵?

另外假設一個人可以製作一部電影作爲製作人,而下一部作爲導演製作。一個人也可以在一部電影中被評爲導演,製片人,作家和演員!

什麼時候變成最佳做法到 這樣做?當許多董事 和生產者在列中出現幾個 次?或者最好是 練習在開始時採用外鍵 的方法?雖然看起來 更有效地使用外鍵,但它也提高了數據庫的複雜性。

您將需要從一開始就掌握外鍵,關係(尤其是一對多和多對多)和常規形式。他們很快就會成爲第二天性。