광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ
반응형

https://koreanraichu.tistory.com/778

 

정규화

정규식과는 아무 상관 없다. 정규식은 레귤러 익스프레션(정규표현식)이고 얘는 노말라이제이션임.정규화의 필요성-이상현상정규화의 목적은 이상현상을 막기 위한 것이다. 이상현상에는 크게

koreanraichu.tistory.com

여기서 정규화에 대해 대충 얘기하면서 반대되는 개념도 있다고 했는데 그게 반정규화다. 근데 반정규화는 모종의 이유로 정규화 했던 걸 롤백하는거지, 정규화를 안 한 상태가 아니다. 정규화를 아예 안 한건 비정규화다. 


취급이 거의 파괴광선

망나뇽 파괴광선 할 때 그거 맞다. 파괴광선이 되게 센 기술같죠? 센 건 맞는데 정작 게임 하는 분들은 잘 안쓴다. 왜죠? 일단 파괴광선은 노말타입 기술이라 고스트타입에게는 안 맞고, 일부 타입(바위, 강철)은 반감된다. 그리고 가장 중요한 건데, 파괴광선은 사용하면 한턴간 행동 불가다. 이건 파괴광선뿐 아니라 시간의 포효(디아루가 전용기)나 무한다이빔(무한다이노 전용기)도 마찬가지다. 모든 익스트림한 고위력기에는 이런 식으로 반동이 있어서 행동 불능이 되거나 스탯이 크게 떨어지거나 반동데미지를 입는다. 그 왜 스파이더맨에서 누가 그러잖아요. 큰 힘에는 큰 책임이 따른다고.

 

아니 얘는 취급이 왜 이래요? 우리가 정규화를 하는 이유를 생각해보면 알 수 있다. 정규화에 대해 얘기하면서 이상현상에 대해 언급했는데, 이걸 막기 위해서 정규화를 한다고 했잖아요? 근데 정규화를 하게 되면 종속 떼버리느라 표를 다 찢어놔서 뭐 하나 볼라면 이거저거요거조거 다 조인을 해야된다. 근데 조인도 연산이잖아요? 아 그죠 시간 오래걸려... 그리고 조인 해보니까 이것도 쿼리 만만찮게 길어져...

 

그럼 바로 반정규화 땅땅땅 하나요? 걔는 취급이 거의 파괴광선 내지는 최종병기 아마겟돈 뭐 이런거라 쓰면 적도 죽는데 우리편도 같이 죽음. 그래서 꼭 반정규화를 해야 하는가, 다른 방법은 없는가를 굉장히 심도있게 논의한 다음 아무리 생각해도 답이 이거밖에 없다 하면 반정규화를 진행한다.

 

사전 절차

위에도 얘기했지만 이상현상을 방지하기 위해 정규화를 한 거고, 그걸 롤백하는 게 반정규화다. 그래서 반정규화를 진행하게 되면 그 이상현상이 또 생길 수도 있기 때문에 진짜 이걸 해야 하나? 다른 방법은 없나? 를 먼저 거의 탕수육 부먹찍먹 내지는 오늘 점심 뭐먹지급 논쟁급 회의를 거쳐서 결론을 내야 한다. 게임으로 치자면 이걸 쓰면 마왕도 죽는데 나는 물론이고 파티원들도 다 죽는 뭐 그런거다.

 

그래서 다른 조치를 취해서 해결될 수 있으면 일단 그걸 도입한다. 일단 문제가 뭔지를 파악하고, 쿼리가 너무 길면 뷰를 만들고, 인덱스나 로직을 조정하고, 그럼에도 불구하고 해결이 안되면 눈물을 머금고 최종병기 반정규화를 가동한다.


칼럼 반정규화

나는 이게 컬럼인지 칼럼인지 아직도 모르것다... 그 서있는거요. 칼럼을 건드린다는 건 '속성'을 건드린다는 얘기다. 엔터티 하면서 언급했던 그 속성 맞습니다. 예? 그럼 불속성이 물속성 되나요? 그건 아니고…

 

1. 중복되는 칼럼을 추가한다. 쟤때문에 조인이 잦아? 그러면 그 칼럼을 하나 더 놓자.

2. 파생 칼럼을 추가한다. 이건 뭔 소리요? 어떤 질의에 대한 계산을 자주 한다면 아예 그 칼럼을 추가한다 이거다. 예를 들어서 포켓몬 도감에서 각 스테이터스별로 종족값을 따로 저장해뒀는데, 보니까 이거 총합을 볼 일이 많은거야. 그러면 종족값 총합 칼럼을 따로 만드는거다.

3. 어떤 게 최근에 등록한건지 모르겠다, 그러면 이력 관련 칼럼을 하나 더 추가한 다음 가장 최신 데이터를 거기에 체크하면 된다. 예를 들어서 내가 핸드폰을 세 번 바꿨다, 그러면 어떤 게 가장 최신 폰인지를 기록하는거다.

4. PK의 의미적 분리를 위한 칼럼을 하나 더 만든다. 요즘 차량번호는 안 그런데 옛날껀 번호판이 다 (지역) 가 1234 이런 식이었다. 그러면 그 지역에 대한 칼럼을 하나 더 만드는거다.

5. 천재지변, 커널패닉(이것도 천재지변 아니냐), 블루스크린(본질적으로는 비슷하지만), 유저의 실수나 변심 등으로 데이터가 소실되는 것을 대비한 칼럼을 만든다. 쉽게 말하자면 갱신되기 바로 직전의 데이터를 저장하는 칼럼을 만드는거다.

 

테이블 반정규화

칼럼단이 아니라 더 큰 스케일의 반정규화다.

 

1. 자주 조인하는 테이블을 걍 다시 합친다. 왜죠? 조인도 연산이라니까요…

2. 슈퍼타입과 서브타입을 병합해서 큰 테이블로 만든다. 이게 머여? 슈퍼타입과 서브타입은 테이블간의 부모자식 관계를 표현한 것이다. 테이블의 가계도 뭐 그런거라고 보면 되는데, 미디움 번호 한번 끊어지면 안 이어지니까 밑에 따로 설명하겠음.

3. 테이블을 가로(수평분할) 혹은 세로(수직분할)로 짼다. 수직분할은 보통 특정 칼럼에 어그로가 많이 쏠릴 때 하고, 수평분할은 테이블에 뭐가 너무 많을 때 진행한다.

4. 이력 테이블과 부분 테이블을 추가하기도 하는데, 이력 테이블은 칼럼 반정규화에서 언급한 이력 칼럼과 달리 아예 가장 최근값을 중복으로 기록하는 테이블을 통으로 만드는 것이다. 부분 테이블은 어그로가 많이 쏠리는 칼럼을 부분 테이블로 추가하는 것이다. 분할과 달리 부분 테이블은 원본 테이블을 유지하면서 작은 테이블을… 이거 뭔 효모 출아법임?

 

슈퍼타입과 서브타입

위에서 테이블에도 가계도 뭐 그런게 있다고 했는데, 슈퍼타입이 부모고 서브타입이 자식이라고 보면 된다. 이걸 병합하는 형태에 따라 세 가지로 나누는데

 

1. one-to-one: 슈퍼타입과 서브타입들이 개별로 나뉘어져 있는 상태

2. plus type: 슈퍼타입과 서브타입을 각각 합쳐둔 상태(슈퍼타입과 서브타입을 합친 상태에서 많이 확인할 경우 진행)

3. single type: 얘 쟤 걔 파이널 퓨전(전체에 대한 일괄 처리가 많을 경우)

 

당연한 얘기지만 모든 것은 등가교환이다. 표를 합칠수록 확장성이 나빠지고 성능이 너프를 먹지만, 반대로 JOIN은 덜 하게 되고 관리하기도 쉽다.

 

관계의 반정규화

이건 또 머선소리9? 관계라는 건 엔터티와 엔터티를 이어주는 무언가다. 예전에는 집에서 구리시 가려면 경의중앙선(그 한번 놓치면 망하는 그거 맞음)을 타거나 버스를 타야 했지만 어느새 8호선이 개통됐으며... 이게 그러니까 어떤 느낌이냐면, 원래 세다리 건너서 연락하던 친구랑 연락처 교환을 하게 돼서 바로 연락을 주고받게된 느낌임. 대충 뭔지 아시죠?

반응형

'Coding > 코딩잡담' 카테고리의 다른 글

NULL이란 무엇인가  (0) 2025.11.12
속성과 관계  (0) 2025.11.11
정규화  (0) 2025.11.10
조인들이 모였네  (0) 2025.11.10
엔터티  (0) 2025.11.10