2011-02-01 25 views
2

我有一个CSV一些数据,看起来像这样:如何将这些邮政编码导入标准化表格?

A0A0A0,48.5674500000,-54.8432250000,Gander,NL 
A0A1A0,47.0073470000,-52.9589210000,Aquaforte,NL 
A0A1B0,47.3622800000,-53.2939930000,Avondale,NL 

但我的数据库标准化,使得城市和省份都在单独的表,每个都有自己的ID列。

那么,将这个文件导入3个独立表格并正确链接外键的最简单方法是什么?


更清晰,表是

cities (id, name, province_id) 
provinces (id, code, name, country_id) 
postal_codes (id, code, city_id) 
countries (id, code, name) 
+0

你是说一个城市的全名的两个相关部分在两个不同的表中?我的意思是,“甘德”在一张桌子上,“NL”在另一张桌子上?我认为这在美国是不可行的。有“富兰克林,阿拉巴马州”,“富兰克林,俄亥俄州”,“富兰克林,阿肯色州” - 至少30弗兰克林在这里。 (同样重要的是,没有“富兰克林,密西西比”。) – 2011-02-01 19:37:59

+0

@Catcall:No ...邮政编码表有一个FK到城市。城市表格中包含该省的名称*和* FK,该州又指向该国家。即允许您在不同州/省使用重复的城市名称。 – mpen 2011-02-01 19:47:51

回答

3

使用COPY导入CSV到一个临时表。比使用一些INSERT INTO ... SELECT ... FROM ...转储正确的表中的数据。

1

...我的数据库是标准化

不会出现如此。有很多问题,但是在这个问题中会引起你的问题是,似乎没有正确的PK,根本没有独特的键;所以你最终会得到重复的数据。 Id“键”不会阻止重复names,您需要name上的唯一索引。目前还不清楚你如何支持同一省份的两个同名的城镇。

  1. 你知道你必须从一个导入表中加载三个表。由于FKs是一件好事,您需要首先加载省份,然后加载城市,然后加载PostalCodes。但从您的导入文件来看,它是城市(或城镇或地方或郊区)......需要首先明确识别解决方案。 Gander和Aquaforte之间有360公里和几十个地方。文件中的记录究竟构成了什么?

  2. 这可能有助于了解优秀的加拿大邮政编码系统的结构。

  3. 然后您需要检查您在Db中存储的粒度级别。显然城市或城镇,但不是郊区,不是地方。县或巴黎人呢?例如_0A ___表示它是一个农村地区;既然你在存储城市,而不是县,而不是城市,你可以忽略它们。

一旦你明确了粒度或源数据的分辨率,您可以在目标表中要解决的水平,就可以加载导入文件中,最有可能是每桌好几波。 SQL很容易。