将表转换为关系表

时间:2012-11-17 17:45:16

标签: php mysql algorithm

在我的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算法,我将在MySQL中生成一个国家表,一个城市表和一个 minidistrict-postalcode表。国家/地区表格很简单,SELECT DISTINCT。我应该为其他表写什么algorythm? algorytm的想法对我来说已经足够了,不需要编码部分。

3 个答案:

答案 0 :(得分: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 :(得分:1)

您不需要PHP来填充新表。

以下是一个例子:

  1. 使用自动增量ID和名称字段
  2. 创建表
  3. 使用

    填充表格

    INSERT INTO country_name(name)(从your_current_table中选择DISTINCT国家/地区)

答案 2 :(得分: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.id添加到cities

此时,您还可以创建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,从没有外键的表开始:

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 );

(如果两个国家/地区的名称相同,则会插入两次城市 - 每个国家/地区都有一个 - 但应该是这样:城市名称通常不是唯一的。)