2012-12-12 95 views
0

我在我的名爲「cats」的mysql中有一個表,這個表有'cat_id','cat_parent','cat_name',並且我決定讓另一個名爲「cats_details 「,它有'cat_id','cat_description','cat_keywords'等,因爲我的類別可以嵌套(每個主類別可以有無限數量的子類別,每個子類別可以有無限數量的子子類別.. .. 。)和類別的數量可能會超過1000.我需要列在一些頁面:P。所以我認爲最好的辦法是有兩個表格,一個用於列出類別並搜索其名稱,另一個用於獲取有關類別的詳細信息。所以我的問題是這種情況的最佳方式是什麼?使用主鍵作爲MySQL的大表中的外鍵

1-使用「cats_details」的「cat_id」作爲自己的主鍵和「cats」表的外鍵。

2-做一個命名爲「cats_details」和「cats_details」作爲「貓」表的外鍵的另一列「CAT_ID」的主鍵「ID」(INT自動遞增)列。

對於大量的類別和大量的訪問者,這種解決方案的速度會更快嗎?

注意:我只在類別詳細信息頁面中使用JOIN,而不在列表頁面中使用JOIN。

回答

1

你期望什麼樣的可擴展性數字?你有沒有做過任何初步的容量規劃?

非規範化通過創建冗餘數據來優化數據庫的讀取,但如果不是統一應用於數據庫中數據的所有冗餘副本,則插入或刪除操作可能會導致數據不一致(因此,維護數據一致性現在存在一些維護開銷應用程序的工作)。

除非您正在查看錶中的數百萬行,使用當前硬件無關緊要 - 規範化沒有問題。

我假設cat_id是一個int或Guid。主鍵將是聚簇索引並使讀取更快,因此選項1將導致更快的讀取。由於主要通過主鍵讀取/連接,選項2效率較低,因爲選項2中的cat_id很可能是非聚集索引(儘管在這種情況下插入/刪除操作會更快)。

+0

在一篇文章中我讀過:所有表都必須有一個自動遞增主鍵,儘管當你使用它們作爲另一個表的一部分,並且外鍵必須是另一個列。 – IVIR3zaM

+0

但您的信息我決定使用我的主鍵作爲外鍵。因爲我需要加入「貓」表本身(爲了獲得每個類別的兒童類別),所以它更好地是重量輕。你對此有何看法? – IVIR3zaM

+1

獲取子類別:自聯接比嵌套查詢(在WHERE子句中指定連接條件)更有效。您可以使用查詢性能分析器來驗證這一點。 – fjxx

0

也許你應該看看錶的規範化。這應該可以解決你的問題。一個很好的鏈接可能是這個:http://www.troubleshooters.com/littstip/ltnorm.html,但任何谷歌搜索表格規範化應該可以幫助你...

+2

我知道正常化。及其級別(1,2,3,4,5,6)。但我的問題是「是正確的使用主鍵作爲外鍵在MySQL或它最好也有一個主鍵和一個外鍵」 – IVIR3zaM