2011-02-01 9 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 프랭클린이 있습니다. (마찬가지로 중요한 것은 "Franklin, Mississippi"는 없습니다.) –

+0

@Catcall : 아니오 ... 우편 번호 테이블에 도시가 FK가 있습니다. 도시 테이블에는 해당 지방을 가리키는 * 및 * FK라는 이름이 있으며, 차례로 국가를 가리 킵니다. 즉, 서로 다른 주 /도에 중복 된 도시 이름을 사용할 수 있습니다. – mpen

답변

3

사용 COPY는 임시 테이블에 CSV를 가져올 수 있습니다. 일부 INSERT INTO ... SELECT ... FROM ...을 사용하여 올바른 테이블에 데이터를 덤프하십시오.

+0

"임시 테이블"이란 무엇입니까? PostgreSQL에 그러한 개념이 있습니까, 아니면 테이블을 만들고 나중에 삭제해야한다는 뜻입니까? ** 편집 : ** Nvm. 예, 있습니다. – mpen

+0

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

+2

이거나 규칙적인 활동 인 경우 매번 시작하기 전에 잘라내는 영구 INBOX 테이블을 만듭니다. –

1

은 ... 내 데이터베이스는

은하지 않는 것으로 정규화된다. 많은 문제가 있지만이 질문에서 당신을 떠날 것입니다, 올바른 PKs, 독특한 열쇠가 전혀없는 것 같습니다; 그래서 당신은 중복 된 데이터로 끝날 것입니다. Id "키"가 중복 names을 방지하지 않으면 name에 고유 색인이 필요합니다. 같은 주에서 같은 이름을 가진 두 도시를 어떻게 지원하는지 명확하지 않습니다.

  1. 가져온 테이블에서 세 개의 테이블을로드해야한다는 것을 알고 계실 것입니다. 좋은 일인 FK로 인해 먼저 주를로드 한 다음 도시와 우편 코드를로드해야합니다. 그러나 가져 오기 파일의 모양을 보면, 도시 (또는 타운 또는 지역 또는 교외 지역)가 먼저 명확하게 식별되어야합니다. Gander와 Aquaforte 사이에는 360km와 수십개의 지역이 있습니다. 파일의 레코드를 정확히 구성하는 것은 무엇입니까?

  2. 우수한 캐나다 우편 체계의 구조를 이해하는 데 도움이 될 수 있습니다.

  3. 그런 다음 Db에 저장하는 세분화 수준을 확인해야합니다. 외관상으로 도시 또는 마을, 그러나 교외가 아니라 지역. 카운티 나 교구는 어떨까요? 예 : _0A ___은 농촌 지역임을 의미합니다. 시정촌이 아닌 카운티가 아닌 도시를 저장하고 있기 때문에 무시할 수 있습니다. 당신이 단위 또는 소스 데이터의 해상도, 대상 테이블에서 원하는 해상도의 수준에 대해 명확되면

, 그런 다음 가져 오기 파일을로드 할 수 있습니다, 대부분의 아마 테이블 당 여러 파도입니다. SQL은 쉽습니다.

관련 문제