2017-02-13 66 views
0

嗨,我在中東歐我的MySQL數據庫經效率的設計..國家省份城市表 - ID或名字

目前我有3個表

tble國家: 國家ID,國家名稱

表狀態: 狀態ID,國家名稱,國家ID

表城市: 城市ID,城市名稱,狀態ID

我想它是否是最好有...

  1. 國名,而不是表狀態國家ID

  2. 狀態名稱,而不是狀態ID的表城市

這是因爲在我的代碼中,我不得不運行額外的查詢來將國家ID,州ID和城市ID從數字轉換爲字母(例如。 1到美國)...只是按字母順序參考不會更好...(更少查詢)

回答

1

全世界有大約

260 country/regions 
5000 states 
many many cities 

設計變化的基礎上,你所需要的。

1 - 對於微小的存儲目的:

country(id,country) 
state(id,state,country_id) 
city(id,city,state_id) 

2 - 對於快速查詢的目的:

city(id,city,state,country) 

3 - 對於中間道路的目的:

country(code,country) 
state(code,country) -- you might merge country and state into one table based on code 
city(state_code,city) 

您可能有興趣查看一下iso代碼:

https://en.wikipedia.org/wiki/ISO_3166-1例如,美國

https://en.wikipedia.org/wiki/ISO_3166-2例如US-NY

結果ISO狀態代碼包含ISO國家代碼。

UPDATE按照更多信息從您:

如果要爲美國設計性網站。

1 - 你不需要一個國家表,最有可能的所有屬性都內美國

2 - 有內美國小於60點的狀態,所以你可以用枚舉保存心滿意足。由於幾乎所有人都會理解NY = New York,因此您不需要州表。

3 - 所以你需要一個城市表。因爲您將使用city_id超過10,000,000個財產記錄。

usa_cities(
    id int PK 
    state enum('NY', 'LA', ...) 
    city varchar 
    ... 
) 

properties(
    id int PK 
    city_id int, 
    .... 
) 

財產表通常是非常大的,你可能會跳過狀態表,以及反規範化設計少加入,加快查詢:

properties (
    id int PK, 
    state enum('NY', 'LA',...) 
    city varchar 
    ... 
) 

您可能能夠使用枚舉城市我也不確定美國有多少城市,但我的第一個想法並沒有鼓勵。

+0

例如在一個屬性網站,每當我做一個插入,更新或選擇 - 我必須運行另一個查詢將ID轉換成名稱和名稱到ID ....喜歡填充下拉列表,做一個搜索輸入框(ajax自動完成)..等等..我要求問的是我應該輸入代碼到MySQL而不是美國放1,然後轉換1到美國whenerever需要或應該我只是繼續前進,插入美國...網上的大多數例子都使用基於代碼的結構,我個人覺得這是額外的負載 – DragonFire

0

如果您想查詢更少的查詢,可以撥打反常規

你可以根據自己的需要減重最重要的東西。

更多關於demonalization意義從techopidiawikipedia