如何将这些邮政编码导入规范化表格?

时间:2011-02-01 18:56:07

标签: postgresql csv import

我有一个包含以下数据的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)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

似乎不是。有很多问题,但是在这个问题中会让你感到困惑的是,似乎没有正确的PK,根本没有唯一的密钥;所以你最终会得到重复的数据。 Id“密钥”不会阻止重复names,您需要name上的唯一索引。目前尚不清楚你如何支持同一省内同名的两个城镇。

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

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

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

  4. 一旦您清楚了解源数据的粒度或分辨率,以及目标表中所需的分辨率级别,就可以加载导入文件,最可能是每个表有几个波形。 SQL很简单。