【问题标题】:How to import these postal codes into a normalized table?如何将这些邮政编码导入规范化表?
【发布时间】:2011-06-19 12:00:48
【问题描述】:

我有一个 CSV,其中包含一些如下所示的数据:

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

但是我的数据库是标准化的,因此 Cities 和 Provinces 位于单独的表中,每个表都有自己的 ID 列。

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


为了更清楚,表格是

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

【问题讨论】:

  • 你是说城市全名的两个相关部分在两个不同的表中?我的意思是,“甘德”在一张桌子上,而“NL”在另一张桌子上?我不认为这在美国是可行的。有“阿拉巴马州富兰克林”、“俄亥俄州富兰克林”、“阿肯色州富兰克林”——这里至少有 30 个富兰克林。 (同样重要的是,没有“富兰克林,密西西比州”。)
  • @Catcall:不......邮政编码表有一个城市的 FK。城市表包含名称到省的FK,而省又指向国家。即,您可以在不同的州/省拥有重复的城市名称。

标签: postgresql csv import


【解决方案1】:

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

【讨论】:

  • “临时表”是什么意思? PostgreSQL 中是否有这样的概念,或者您的意思是我应该创建一个表并稍后将其删除? 编辑: Nvm。是的。
  • temp = 临时:CREATE TEMP TABLE foo(bar INT);
  • 或者如果是常规活动,请创建一个永久的收件箱表,在每次开始之前将其截断。
【解决方案2】:

...我的数据库已规范化

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

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

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

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

一旦您清楚了源数据的粒度或分辨率,以及您希望在目标表中达到的分辨率级别,您就可以加载导入文件,很可能每个表有几个波。 SQL 很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多