2012-03-19 65 views
0

我有一個utf8中的國家和城市名稱列表。當任一列表被提取時,它應該以它輸入的相同順序返回。非數字字段作爲PK - 數據庫設計問題

例如:

Country(country_name|PK) 
City(city_name|PK, country_name|FK) 

COUNTRY_NAME和CITY_NAME不會改變,固定值。但是,排序會是一個問題。爲了確保我保留作爲

Country: 
UK 
US 
Africa 

我添加了一個名爲1和高達sortcountry這將數值新列輸入的順序值。

Country(country_name|PK, sortcountry) 

同樣的東西適用於城市表。

我覺得這是比country(country_id, countryname)一個更好的解決方案。我做對了嗎?

回答

0

如果排序不遵循任何其他自然規則,則添加用於排序的列是沒有問題的。

不過,您可能想有一個主鍵只sortcountry因爲數據將根據它的主/聚集索引存儲在磁盤上。如果你正常地選擇所有國家,那麼你會希望他們以正確的順序從磁盤讀取。

然後添加另一個唯一索引COUNTRY_NAME以確保每個名稱是唯一的(就像它在那裏主鍵)和搜索。你不想用sortcountry作爲你的密鑰運行更新。

+1

依靠磁盤上的PK順序存儲MySQL條目是不安全的。選擇和訂購幾百行產品通常不會導致問題。我會邏輯地構造數據(即使用country_id作爲PK和單獨的排序列)。可能會有更大的性能問題需要在應用程序的其他地方進行優化。 – liquorvicar 2012-03-19 07:24:44

+0

我試圖避免不必要的內部連接。通過做我剛剛做的事情,我可以在不需要加入的情況下爲每個查詢獲取城市列表。另一種選擇是什麼?爲sortcountry分配PK,然後在sortcountry(FK)旁邊添加countryname?這是一個好的替代解決方案嗎?注意:假定sortcountry代表country_id – user311509 2012-03-19 11:25:07

0

「我做對了嗎?」

絕對不是。

對於任何查詢的結果都沒有固有的順序。如果您希望引擎以特定順序返回查詢結果,則您的工作是使用ORDER BY子句指定該訂單。

+0

是的,按sortcolumn ASC排序。請注意,國家/地區列表不正確。以字母A開頭的國家可以在列表中的任何地方。做ORDER BY將根據違反現有秩序的字母或左右排序。無論如何,我決定刪除sortcolumn,因爲只要我不使用ORDER,將country_name作爲返回列表。如果您有意見,請隨時通知我。 – user311509 2012-03-19 13:19:31