2013-06-18 3 views
0

모든 종류의 고객 정보가 포함 된 기존 테이블이 있습니다. 현재 "도시"뿐만 아니라 "지역"과 "상태"가 문자열로 3 열에 나열되어 있습니다. 중복 정보!MySQL 기존 테이블의 기존 열에서 피벗 테이블 만들기

각 도시마다 단일 항목을 포함하는 3 개의 새 테이블을 하나의 도시와 하나의 지역 및 하나의 주를 위해 만들고 싶습니다. 그런 다음 기존의 ID를 다시 참조하십시오. location_id가있는 고객 테이블.

어떻게 도시의 이름을 도시 테이블로 내보내고, 다른 지역을 지역 테이블로 내보내고 도시가 region_id와 state_id 테이블을 참조하게하여 정보가 모두 그룹화되도록할까요?

Amatuer 질문은 확실하지만 도움을 주셔서 감사합니다!

+0

이것은 몇 가지 기본 SQL 쿼리를 통해 쉽게 달성 할 수 있습니다. 이 노력을 시작하려했는데 특정 문제가 발생 했습니까? –

+0

또한이 경우 정규화 수준에 대한 필요성을 질문 할 수 있습니다. 도시를 단지 당신의 애플리케이션에서 별개의 객체로 취급하려고한다면 지역과 주정부는 단지이 객체의 속성 일뿐입니다. 도시를 국가 및 지역이있는 자체 테이블로 끌어 올 것입니다. 물론 주 및 지역을 일류 객체 (즉, 지역 및 주마다 고유 한 속성을 가짐)로 취급 한 다음 정규화합니다. –

+0

안녕하세요. 감사합니다. 네, 저는 단지 ... 오늘 뇌염으로 죽었습니다. 나는 거기에 포함 된 별개의 정보가있을 것이므로 지역 차원에 대한 정규화가 필요하다. 나는 국가 수준을 위해 동일한 것을 예기하고있다. 그래서 나는 그것이 미안보다 더 안전하다고 생각한다? – Benshack

답변

0

세 가지 다른 테이블이 필요하지 않습니다! 세 개의 열 (city, state, region)이있는 하나의 표가 필요합니다.

그 이유는 city이 단독으로 존재하지 않기 때문입니다. 미국에서 스프링 필드 (일리노이 주)를 고려하십시오. 그리고 스프링 필드, MA. 또는 마이애미, 플로리다 및 마이애미, 오하이오. 보유하고있는 것은 계층 구조가있는 데이터의 차원입니다. 이것을 저장하는 올바른 방법은 다른 정보를 제공하는 "차원"표를 사용하여 가장 낮은 수준 (도시의 경우)입니다.

원래의 데이터가 정확하다는 것을 가정 할 때, 당신은 같은 것을 할 수 있습니다

create table Cities (
    CityId int auto_increment not null primary key, 
    City varchar(255), 
    State varchar(255), 
    Region varchar(255) 
); 

insert into Cities(City, State, Region) 
    select distinct City, State, Region 
    from YourTable; 

내가이 "표준 정규 형태"아니라고 알고 있습니다. 그러나 대부분의 응용 프로그램에서이 방법이 효과적입니다. 예를 들어 목록에서 상태를 선택하려는 응용 프로그램에서이 작업을 수행하는 경우 상태에 대한 인덱스를 만들면 쿼리가 빨라집니다.

상태 및 지역 수준에서 별도의 표를 원할 수있는 경우가 있습니다. 이러한 수준에서 다른 열이 많이있는 경우에도 마찬가지입니다. 특히 인 경우 해당 열의 값을으로 수정하십시오. 데이터가 정적 일 때 평평한 치수 (여기에 설명 된 것과 같은)가 가장 적합합니다 (도시에서는 상태가 자주 변경되지 않음). 표준화는 여러 수준에서 값을 변경할 때 가장 적합합니다.

+0

초기 문제 설명에서와 똑같은 생각을 가졌습니다. 정상화는 과도 할 것입니다. 후속 의견을 살펴 본다면, 최소한 지역 차원에서 정규화에 대한 합당한 이유가있는 것처럼 보입니다. –

+0

그러나 정기적으로 지역 정보에 포함 된 정보를 변경하는 경우 해당 열을 해당 테이블로 정규화하는 것이 현명한 방법일까요? – Benshack

+0

@Decalmo. . . 예. 이 경우 업데이트해야 할 필요가있는 정보에 대한 표준화 된 접근 방식을 제안합니다. 하지만 도시와 주를 분리해서는 안됩니다. –

관련 문제