2011-09-17 2 views
1

예를 들어 City 열이 있습니다. 도시 값의 95 %가 NULL입니다. city_names (Id PK, City)와 같은 표를 만들고 City를 City_id (FK는 city_names (id)를 참조)로 대체하는 것이 좋습니다. 여기에 대한 나의 생각이있다. 그것들은 계산에 대한 일반적인 생각을 기반으로합니다. 제발 그것을 수정하십시오 이것은 RDMS에 적용되지 않습니다.내 경우 공통 데이터 분리가 좋은가요?

첫번째 방법 : O (n)이 저장 O (n)이 일괄 작업 O (1) 랜덤 액세스

번째 방법 : O (n)이 저장 O (N * logn) 인해 인덱스 N 요청을 일괄 작업 구조 (예를 들어 B- 나무) O (lon n) 랜덤 액세스

다음은 전체 그림입니다. 나는 1M 행 테이블을 가지고있다. 그것은 자랍니다. 도시와 같은 80 개의 기둥이 있습니다. 그들은 모두 거의 NULL'ed. 그러나 커뮤니티 편집이 가능합니다. 따라서 전체 텍스트 검색, 빠른 편집 시간 및 복잡한 쿼리 (고급 사용자 또는 봇)를 제공해야합니다. 언젠가는 NULL이 전혀 없을 것입니다. 그래서 최종 모양의 테이블을 편집 단계와 마녀에 사용해야하는 윈치 체계는 무엇입니까?

중요한 경우 postgres \ mysql을 사용합니다.

+0

이러한 솔루션 중 하나만 요구하지는 않습니다.어떤 기술을 조언 할 수 있습니다. – FirstTimePoster

+1

그것은 정규화라고 불리고 있습니다. 그렇습니다. 좋은 생각입니다 ... –

+0

@Mitch Wheat하지만 성능이 매우 크게 떨어집니다. 또한 조인이 너무 많습니다. 여기 뭔가 잘못 됐어, 과도하게 조작 된 것 같아. – FirstTimePoster

답변

1

PostgreSQL에서 NULLS 비용은 거의 없습니다. (각 1 비트, 한 번에 8 비트, 단어 맞춤을 더하면 값이 더 저렴하고 저렴합니다.)

너와 같이 띄엄 띄엄 채워진 열의 경우, 열을 자체 테이블로 옮기는 데 아무런 이득이 없으며 항상 희소 한 데이터를 얻으 려 할 때 상당한 손실이 발생합니다.

0

예를 들어 도시 열이 있습니다. 도시 값의 95 %가 NULL입니다. city_names (Id PK, City)와 같은 표를 만들고 도시를 City_id (FK가 city_names (id)를 참조하는 새 열로 바꾸는 것이 좋습니다)입니까?

도시 열을 city_id 열로 바꾸면 행의 95 %가 여전히 NULL이됩니다. 그렇지 않습니까? 디스크 공간은 줄어들지 만 도시 이름을 반환해야하는 모든 쿼리에 대해 조인이 필요합니다.

텍스트를 ID 번호로 바꾸는 작업은 정규화와 관련이 없습니다. 정규화는 항상 원본 테이블의 열 수를 줄입니다.

"도시"는 일반적으로 도시의 전체 이름이 아니라는 문제도 있습니다. 실제로 두세 개의 열을 다른 테이블로 옮길 필요가 있습니다. 미국에는 "워싱턴"이라는 도시가 많이 있습니다. 사실, 1800 년대에는 "워싱턴, 캘리포니아, 미국"이라는 도시가 두 개있었습니다. 미국의 도시에서는 도시, 주 및 국가를 새로운 테이블로 이동하는 것이 좋습니다. 다시 말하지만 디스크 공간은 줄어들지 만 해당 열을 반환해야하는 모든 쿼리에 대해 조인이 필요합니다.

현재 조인을 사용하여 사람이 읽을 수있는 텍스트의 모든 80 열을 반환 할 수 있습니다. 텍스트 열의 절반을 다른 테이블의 ID 번호에 대한 외래 키 참조로 바꾸면 40 개의 조인으로 쿼리를 작성해야 모든 데이터를 다시 읽을 수있는 지점으로 되돌릴 수 있습니다.

40 개 조인이 필요한 변경을하기 전에 길고 힘듭니다.

이 모든 것을 말하자면, 95 % NULL 인 80 컬럼 테이블은 BCNF에있을 가능성이 없으며 BCNF 또는 5NF로 정규화하면 도움이 될 수 있습니다. 정상화는 "해당 텍스트를 ID 번호로 대체"한다는 의미가 아닙니다.

+0

"40 개의 조인이 필요한 변경을하기 전에 길고 힘듭니다." 예. 이. 충고에 감사하다. 나는 정상화에 관한 더 많은 이야기를 읽을 것이다. – FirstTimePoster

관련 문제