2010-10-10 98 views
1

我想了解這個概念。例如:我有兩張桌子城市和國家。基本桌面設計Q

Country 
------- 
id 
abbreviation 
name 


City 
----- 
id 
name 
Country (name or id, or both? - This is the question) 

要引用,並保持特定城市同步與它所屬的國家,我想這將是參考country.id爲FK。這意味着城市表的一個例子是:(200,紐約,19) - 其中19 =美國在國家表中。但是,這並不能幫助觀看桌子的人,因爲他不知道什麼是19,而不是在國家桌子上查找什麼是19。

所以我想把這個國家的名字也加到城市表中,所以它寫道:(200,紐約,美國)。我不需要顯示19,因爲19對讀者沒有用處,但僅用於連接表格。

那麼,我應該怎麼做我的表格colunms/FK看起來像我可以存儲在這樣的城市表格行(200,紐約,美國),但確保紐約將永遠參考美國在美國查找,並保持19這是美國走出城市桌的主要關鍵,所以桌子看起來乾淨,容易理解?我假設如果這些被引用,明天如果我將美國更新爲20,它將在城市表中自行更新,如果我將美國重命名爲美國,它將自行更新到城市表中。

  • 我的DB是在MySQL

回答

0

你不知道,如果你需要有在DB「可用」的表,所以有人可以輕鬆地查看一些與選擇有用的*等。(或者更容易手動編寫SQL)。然後按照上面的常規形式創建表格,然後創建一個組合表格的VIEW。

+0

更輸出。如果我使用城市查找表作爲autosuggest,我想顯示:美國紐約。這是最終目標。爲了得到它,這意味着我必須查找城市,然後看到19國的參考,在國家表中找到19並輸出美國,所以它讀取美國紐約。 ...但是如果我在城市表中有國家名稱,那麼這是一個簡單的輸出,不會觸及兩個表格。注意:這僅是示例。我有數百個這樣的查找需要創建acoss多個表,因此我試圖理解所有這些基本概念。 – Ian 2010-10-10 02:52:41

+0

我想確保如果我在城市表中保留國家/地區名稱,它仍然與它的父國家/地區表有關,因此任何未來的名稱或ID更改都會反映到所引用的所有表上。 – Ian 2010-10-10 02:54:09

+0

哈哈,所以你認爲從一個簡單的連接性能打擊會花費你很多,它是值得的,以保持你的表格不正常的形式? – 2010-10-10 03:07:43

0

表不應該被人看到:某些應用程序應該訪問表以便以可以解析它的方式向人們呈現數據。您希望country.id作爲FK的原因是,您沒有一百萬行國家名稱爲「USA」的行,因爲那樣會出現各種問題,例如發生錯誤時會發生什麼情況「美國A」登陸其中一個領域?或者,如果你想改變用戶從「美國」到「美國」的看法?

來處理它的正確方法是使用country.id爲您最初建議,然後使用JOIN語句來呈現數據,如下所示:

SELECT city.name, country.name 
    FROM city JOIN country ON country.id = city.country 

我的語法是關閉的,但這實質上就是你想要的。

1

爲什麼不使用ISO 3166國家代碼(2個字符或3個字符)作爲國家ID?這使您在城市表中留下可識別的代碼;您可以映射到國家/地區表中的全名。

至於查看數據,使用視圖來創建一個漂亮的表:

CREATE VIEW CityInfo(CityID, CityName, CountryID, CountryName) AS 
    SELECT ci.id, ci.name, ci.country, co.name 
     FROM City AS ci JOIN Country AS co ON ci.Country = co.id; 
+0

這只是一個例子。我有很多像鄰域,州,地區,本地,郵政等數據需要連接到eachother,所以我想理解所有這些表使用的概念,所以1)表中的數據是有道理的, 2)聯接數量少,3)數據可以在表格之間保持同步(如強制執行),所以如果我對主查找表進行更改,其他任何名稱更改都會更新。 – Ian 2010-10-10 02:57:57

+0

然後,你將不得不決定如何處理事情。你進入兇猛複雜的領域,特別是如果你想分析不同國家的地址。您可以創建表以避免連接;請注意,與完全標準化的表相比,您正在爲自己設置非常複雜的更新操作。如果使用完全標準化的表格 - 如果它們經常改變,你可能會更好。如果它們一旦建立就基本是靜態的,那麼可能「預加入」版本更好。但是,你對美國以外地址的分析將是關鍵因素。 – 2010-10-10 03:16:03

+0

另見:[SO 3094126](http://stackoverflow.com/questions/3094126/best-practice-standard-for-storing-an-address-in-a-sql-database/),[S 929684O]( http://stackoverflow.com/questions/929684/is-there-common-street-addresses-database-design-for-all-addresses-of-the-world/),[SO 310540](http:// stackoverflow .com/questions/310540/best-practices-for-storage-postal-addresses-in-a-database-rdbms /),僅列出三個。 – 2010-10-10 03:19:15