2012-11-17 38 views
0

在我的MySQL表中,我有一個簡單的郵政編碼表,我已經從.xlsx文件轉換它。將錶轉換爲關係表

Country |City |MiniDistrict |Postal Code 
--------------------------------------------- 
Bulgaria |Sofia |Oborishte | 0844 
Bulgaria |Sofia |Sredets  | 0988 
Bulgaria |Plovdiv |Montana  | 1299 
Bulgaria |Plovdiv |Dyavol  | 1288 
Bulgaria |Varna |Andeevo  | 1574 
France |Paris |Mantois  |38992 
France |Paris |Valois  |38764 
France |Gard |Lussan  |55980 

正如你所看到的,國家和城市名稱重複數次。還要注意在不同國家有相同的城市名稱。我想寫一個PHP算法,我將生成一個國家表,城市表minidistrict郵政編碼表到MySQL。國家表很容易,SELECT DISTINCT。我應該寫什麼algorythm其他表格? algorytm的想法對我來說已經足夠了,不需要編碼部分。

回答

1

「算法」是這樣的:你注意到每個MiniDistrict都有一個PostalCode,一個每個PostalCode都有其MiniDistrict。所以你把它們放在一個表中,並將每一對與一個唯一的ID關聯起來。

CREATE TABLE district_postalcode 
(
    id integer not null primary key auto_increment, 
    minidistrict varchar(???), 
    postalcode char(5) 
); 

然後你發現,每個城市是一個單一的對象,同爲國家,讓你爲他們創建兩個表,每個都有自己的ID。

現在您必須存儲小區和城市之間的關係。但這是多對一的關係:許多小區可能屬於同一個城市,但同一個小區不能屬於兩個城市。

因此,您將cities.id的引用作爲外鍵city_id添加到小區。

城市和國家之間的關係結構是相同的。所以你再次添加一個外鍵,這次是country_idcountries.idcities

在這一點上,你還可以創建一個VIEW看到你的數據之前:

CREATE VIEW old_style AS SELECT 
    countries.Country, 
    cities.City, 
    districts.MiniDistrict, 
    districts.PostalCode 
FROM districts 
    JOIN cities ON (cities.id = districts.city_id) 
    JOIN countries ON (country.id = cities.country_id); 

您也可以填充你的新districtscitiescountries從現有的數據,與具有表開始沒有外鍵: - 一個與每個國家的ID -

INSERT INTO countries (Country) SELECT DISTINCT Country FROM old_table; 

INSERT INTO cities (City, country_id) 
    SELECT DISTINCT City, Country.id 
    FROM old_table 
    JOIN countries ON (old_table.Country = countries.Country); 

(這是否與兩國存在同名兩次插入一個城市,但是那是因爲它應該是:城市名稱通常不唯一)。

2

嘗試像

table_Country

Country_id | country_name 
    1  | Bulgaria 
    2  | France  

table_City

City_id | Country_id | City_name 
    1 | 1   | Sofia 
    2 | 1   | Plovdiv 
    3 | 1   | Andeevo 
    4 | 2   | Paris 
    5 | 3   | Gard  

table_MiniDistrict

MiniDistrict_id | City_id | MiniDistrict_Postal 
1

你不需要PHP來填充新表。

下面是一個例子:

  1. 創建使用

    INSERT INTO COUNTRY_NAME(名)自動增量ID和姓名字段

  2. 填充表的表(SELECT DISTINCT國家FROM your_current_table)