2010-08-21 2 views
4

나는 데이터베이스의 비정규 화를 이해하려고 시도하고 있지만, 구글의 거의 모든 기사는 고급 DB 관리자를 대상으로하고 있습니다. 나는 MySQL과 MSSQL에 관한 상당한 지식을 가지고 있지만 실제로 이것을 이해할 수는 없다.사전 계산 역 정규화가 있습니까? 그렇지 않다면, (단순한 용어로) 무엇입니까?

속도가 문제가 될 때 생각할 수있는 유일한 예는 인턴에서 사용했던 장소의 두 테이블에서 약 2,500,000 개의 행에 대한 계산을 할 때였습니다. 당신이 짐작할 수 있듯이, 수요에 따라 많은 것을 계산하는 것은 영원히 끝나고 몇 분 동안 있었던 dev 서버를 동결 시켰습니다. 바로 전에 상사를 떠나기 전에 모든 미리 계산 된 값을 보유 할 계산 테이블을 작성하고 약 1 시간 정도마다 업데이트 될 것입니다 (이것은 자주 사용되지 않는 내부 사이트였습니다). 그러나 내가 떠났으므로 끝내지 못했다.

이것은 비정규 화의 예가 될 것인가? 그렇다면 이것에 대한 좋은 예입니까 아니면 더 멀리 나아가나요? 그렇지 않다면 단순한 용어로 무엇입니까?

+2

"정상적으로 작동 할 때까지 정상화하고 작동 할 때까지 비정규 화합니다."라는 말이 있습니다. –

+0

Mitch is correct .. 또한 denormalized <> 비정규 화 된 과정 :-) – SQLMenace

+0

정규화를 알고 있습니까? –

답변

2

가족 연락처 세부 정보를 저장하는 데 사용할 워크 시트 2 개가 포함 된 Excel 파일이 있다고 가정 해보십시오.첫 번째 워크 시트에는 연락처의 이름과 휴대 전화 번호가 있습니다. 두 번째 워크 시트에는 유선 전화 번호가있는 각 가족에 대한 우편 주소가 있습니다.

이제 모든 이름을 나열한 모든 가족 연락처에 크리스마스 카드 라벨을 인쇄하려고하지만 우편 주소 당 하나의 라벨 만 인쇄하려고합니다.

두 개의 정규화 된 세트를 연결하는 방법이 필요합니다. 가지고있는 두 세트의 모든 데이터가 정규화됩니다. 하나의 '원자'를 나타내는 '원자'또는 분해 될 수없는 정보 조각입니다. 그것의 아무 것도 반복되지 않는다.

2 세트의 비정규화된보기에서 메일 링 주소가있는 모든 연락처 목록이 여러 번 반복됩니다 (사촌 Alan은 동일한 주소의 Bob 삼촌과 살기 때문에 Alan과 Bob의 행에 모두 표시됨). .)

이 시점에서 두 세트에 세대 ID를 연결하여 연결하려고합니다. 각 우편 주소에는 하나의 세대 ID가 있으며 각 연락처에는 반복 할 수있는 세대 ID 값이 있습니다 (동일한 가정에 거주하는 Alan 및 Bob 부부는 동일한 세대 ID를가집니다)

이제 직장에 있다고 말하면됩니다. 수많은 연락처와 세대를 추적합니다. 연락처 및 세대 정보를 한 곳에서 저장하기 때문에 데이터를 정규화 된 상태로 유지하는 것이 유지 관리 목적으로 유용합니다. 주소를 업데이트하면 관련된 모든 연락처에 대해 주소가 업데이트됩니다. 불행히도 성능상의 이유로 서버에 두 개의 관련 세트에 참여할 것을 요청하면 영원히 걸립니다.

따라서 일부 개발자는 모든 연락처와 행을 모두 포함하는 하나의 비정규 화 테이블을 만들어 가정 세부 정보가 다시 채워지도록합니다. 성능이 향상되고 공간 고려 사항이 창 밖으로 튀어 나오게됩니다. 이제는 2 대신 3 행의 공간이 필요합니다.

의미가 있습니까?

+0

예를 들어 40 만 개가 넘는 2 개의 테이블을 합치면 정말 비싼 것입니까? 나는 항상 다소 가벼운 조작이라고 생각했습니다. – TheLQ

+0

아니요, 성능을 저해하지 않아야하지만, 서버가 정규화 된 테이블보다 성능이 더 좋을 것이라는 아이디어가 있습니다. 조인을해라. – Beth

0

비정규 화는 유용 할 수 있습니다. 제공 한 예는이 예입니다. 비용이 비싸고 테이블을 생성하고 다른 테이블을 계산 값과 함께 참조하는 기능적 ID를 가지므로 동적으로 계산하는 것은 이상적입니다.

데이터는 다른 테이블에서 파생 될 수 있으므로 중복되지만 생산 요구 사항으로 인해 기능적인 측면에서 더 나은 디자인입니다.

내 SQL 교수가 용어를 비정규 화하는 것을 보았 기 때문에 다른 사람들이이 주제에 관해 무엇을 말하고 있는지 궁금하지만, 실용적입니다.

1

나는 그 집계를 비정규 화라고 부르지 않을 것입니다. (예를 들어 주문 수량이라면 하루에 SUM (Orders) ...). 이것은 OLAP이 사용되는 것입니다. 예를 들어, 비정규 화는 ContactType 테이블에 PhoneType 테이블과 PhoneTypeID를 갖는 대신 연락처 테이블에 PhoneType이 있으므로 1 개의 조인을 제거 할 수 있습니다.

물론 인덱스/구체화 된 뷰를 사용하여 집계 값은 ...하지만 지금은 당신이 당신의 갱신 속도를 느리게 삭제하고 기존 데이터에서 추론 완벽 한,

트리거는이 테이블을 거부 할이

0

일반 양식을 달성하는 또 다른 방법입니다 삽입됩니다. 그러나 성능상의 이유로이 유형의 데이터가 일반적으로 발견됩니다. 예를 들어 재고 조사는 일반적으로 수행되지만이를 생성 한 거래에서 파생됩니다.

더 작은 더 빠른 세트의 경우보기를 사용하여 집계를 유도 할 수 있습니다. 이렇게하면 사용자가 스스로 집계하지 않고 필요한 데이터 (집계 된 값)를 사용자에게 제공합니다. Oracle (및 다른 사람들)은 관리자가 제안한 것을 수행하기 위해 구체화 된 뷰를 도입했습니다. 다양한 일정에 따라 업데이트 될 수 있습니다.

갱신 볼륨이 허용되면 트리거를 사용하여 테이블을 사용하여 구체화 된보기를에 D 레이트 할 수 있습니다. 이는 집계 된 값을 유지 보수하는 비용을 줄일 수 있습니다. 그렇지 않은 경우 오랜 기간 동안 오버 헤드가 분산됩니다. 그러나 교착 상태가 발생할 위험이 있습니다.

OLAP는이 단순한 경우를 집계에서 더욱 중요하게 생각합니다. 분석가는 세부 사항이 아닌 집계 된 값에 관심이 있습니다. 그러나 집계 된 값이 흥미로운 경우 세부 정보를 볼 수 있습니다. 정상적인 형태에서 시작해서, 여전히 좋은 습관입니다.

1

지나치게 단순화 된 형태에서 나는 동일한 데이터를 표현하는 데 사용되는 테이블의 수를 줄이는 것으로 정규화를 설명합니다.

고객과 주소는 여러 주소를 가진 한 고객의 개념을 허용하기 위해 종종 서로 다른 테이블에 보관됩니다. (직장, 집, 현재 주소, 이전 주소 등)

동일 성은 성 및 다른 속성에 적용되는 것으로 간주 될 수 있지만 현재의 성만 문제가 될 수 있습니다. 따라서 외래 키 관계가있는 Customer 테이블과 Surname 테이블을 갖는 모든 방법을 정규화 할 수 있습니다. 그러나 두 테이블을 병합하여 비정규 화합니다.

"정상화 될 때까지 정상화"의 이점은 데이터 및 가능한 동작과 관계에 대한 순수하고 (바라기를) 완전한 표현을 고려하도록 강요한다는 것입니다.

"정상적으로 작동 할 때까지 비정규 화"의 이점은 특정 유지 관리 및/또는 처리 오버 헤드를 줄이는 것이지만 정규화 된 모델을 작업하여 파생 된 것과 동일한 기본 모델을 고수하는 것입니다.

"성"예에서 비정규 화를 통해 성 및 생년월일을 기준으로 고객에게 색인을 추가 할 수 있습니다. 정규화를 해제하지 않으면 성 및 DoB가 서로 다른 테이블에 있고 복합 인덱스가 가능하지 않습니다.

관련 문제