2011-02-01 5 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

市の名前の2つの関連する部分が2つの異なる表にあると言っていますか?つまり、「ガンダー」は1つのテーブルにあり、「NL」は別のテーブルにありますか?私はそれが米国では今でも実行可能であるとは思わない。 "フランクリン、アラバマ"、 "フランクリン、オハイオ"、 "フランクリン、アーカンソー" - 少なくとも30フランクリンここにあります。 (また、同様に重要なのは、 "Franklin、Mississippi"はありません。) –

+0

@Catcall:いいえ...郵便番号表は市にFKです。都市表には州名*と* FKが含まれていて、その州は国を指しています。つまり、異なる州/州で重複した都市名を持つことが許可されています。 – mpen

答えて

3

一時テーブルにCSVファイルをインポートするCOPYを使用しています。一部のINSERT INTO ... SELECT ... FROM ...を使用して、正しい表にデータをダンプします。

+0

「一時テーブル」とはどういう意味ですか? PostgreSQLにこのような概念があるのですか?それとも、テーブルを作成して後で削除する必要があるのですか? **編集:** Nvm。はいあります。 – mpen

+0

temp = temporary: 'CREATE TEMP TABLE foo(bar INT);' –

+2

またはそれが通常のアクティビティの場合は、毎回起動する前に切り捨てる永続的なINBOXテーブルを作成します。 –

1

...私のデータベースは

はしていないと思われる正規化されています。多くの問題がありますが、あなたはこの質問であなたを動かすでしょう、正しいPKs、一意のキーはないようです。あなたは重複したデータに終わるでしょう。 Id「キー」は重複namesを防止しないため、nameにユニークなインデックスが必要です。同じ州で同じ名前の2つの町をどのようにサポートしているかははっきりしない。

  1. インポートされた1つのテーブルから3つのテーブルを読み込む必要があることがわかっています。良いものであるFKsのために、あなたは最初に州を、次にCityを、次にPostalCodesをロードする必要があります。しかし、あなたのインポートファイルの見た目からは、都市(または町または地方または郊外)...決議が最初に明確に識別される必要があります。ガンダーとアクアフォルテの間には360キロメートル、数十の地方があります。ファイルのレコードを正確に構成するものは何ですか?

  2. 優れたカナダの郵便番号体系の構造を理解するのに役立ちます。

  3. 次に、Dbに格納している粒度レベルを確認する必要があります。明らかに都市や町ですが、郊外ではなく地方ではありません。郡や教区はどうですか?例:_0A ___は農村地域を意味します。地方自治体ではなく郡ではなく都市を保管しているので、無視することができます。

あなたは粒度や解像度ソースデータの、そしてあなたがターゲット表にしたい解像度のレベルについて明確になったら、あなたがしてインポートファイルを読み込むことができ、おそらくテーブルごとにいくつかの波です。 SQLは簡単です。

関連する問題