[검색] 공부하기/DataBase

테이블 정규화 by 코딩애플

Ben의 프로그램 2023. 10. 3. 11:16
728x90

핵심 Keyword

1. 제1정규형 

2. 제2정규형 (Composite Primary Key, Partial Dependency)

3. 제3정규형 


제1 정규형
체육 센터의 DB에 위와 같이 데이터가 저장되어 있다고 했을 때, 검색이 굉장히 귀찮아진다. 예를 들어서, '골프초급'을 수강중인 회원의 이름을 검색하려고 할 때, 골프초급을 검색하는 것이 까다로워지기 때문이다. WHERE 프로그램 = '골프초급' 이렇게 간단한 WHERE Clause 를 사용하는 것이 아니라 WHERE 프로그램 LIKE '%골프초급%' 이런 식으로 검색을 진행해야 하기 때문이다. 검색 성능이 저하되는 문제가 발생하게 된다. 또한, 프로그램명의 수정도 어려워지게 됩니다. (단점 : 검색, 수정 번거로움 & 성능저하)

이런 문제들 때문에 "한 칸엔 하나의 데이터만" 저장하는 방식으로 DB의 형식을 바꾸게 되는데, 이것이 '제1 정규형 테이블'이다. 이런 식으로 해두면 Select 의 성능 저하도 방지하고, 수정의 번거로움도 해결할 수 있다. 즉, 제1정규화를 진행하는 것이 더 바람직한 방식입니다. 

 

제2정규형
수강등록현황 테이블 내부에 가격과 납부 여부를 추가시켰습니다. 그런데, 이런 식으로 테이블을 저장하게 된다면, 나중에 문제가 발생할 수 있습니다. 만약 '헬스' 프로그램의 가격을 7,000원으로 수정하게 된다면 어떻게 될까요? 지금은 튜플이 몇개 없기 때문에 큰 문제가 아닐 수 있지만, 만약 수정해야 하는 튜플이 만개가 넘어가면 큰 문제입니다. 가격 하나 수정하는데, 몇 만개의 튜플을 수정해야 하기 때문에 비효율이 발생합니다. 이런 불상사를 방지하는 것이 '제2정규화'입니다. 제2정규화를 쉬운 말로 하면 "현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업"입니다. 지금 가격 컬럼을 보면 수강등록현황 테이블이라는 주제와 동떨어져 있는 것을 볼 수 있습니다. 가격 컬럼은 현재 테이블의 주제와 관련이 없기 때문에 별도의 테이블로 빼는 것을 의미합니다.

이렇게 수정을 하게 되면, 아까 헬스의 가격을 수정하려면 몇 만개의 튜플을 전부 수정해야 했지만, 지금은 한 곳만 수정하면 됩니다. 수정의 장점이 있는 것이죠. 단점도 있는데, 검색의 비효율이 발생합니다. 예를 들어서 김민수는 얼마를 내야 하는가? 라는 질문의 답을 알기 위해서는 이전에 한 테이블안에서 정보를 모두 확인할 수 있었다면 지금은 다른 두 개의 테이블에서 정보를 가져와야 합니다. 

비관계형 DB들은 정규화를 안하는 이유가 여기에 있습니다. 정규화를 안하면서 발생하는 문제가 있지만, 그런 단점들을 감수하는 것이죠. 하지만, 우리가 주로 이용하는 관계형 DB들은 테이블을 정규화 해두는게 일반적입니다. 

제2정규형의 어려운(정확한) 정의는 Partial Dependency 를 제거한 테이블이라고 이해할 수 있습니다. Partial Dependency 를 이해하기 위해서 'Composite Primary Key' 라는 개념을 우선 이해하고 넘어가겠습니다. 우선 PK 라는 개념을 배웠었는데요. PK는 행을 서로 구분하기 위한 유니크한 값들을 담은 컬럼을 의미합니다. 

이런 PK가 없는 경우에도 PK의 역할을 수행하는 컬럼들을 지정할 수 있는데요. 위의 예시에서는 회원번호, 프로그램 컬럼을 묶어서 Composite Primary Key 라고 할 수 있습니다. 이런 Composite Primary Key 는 집합으로서 PK의 역할을 수행할 수 있습니다. 

Partial Dependency 는 이런 Composite Primary Key 와 연관지어서 이해할 수 있습니다. 가격 컬럼은 Composite Primary Key 에 의해서 값이 정해지는 종속의 관계를 갖고 있는데요. 이 경우에 가격 컬럼은 Composite Primary Key 에 대해서 Partial Dependency 가 있다고 말을 합니다. 이런 Partial Dependency 를 갖고 있는 컬럼을 별도의 테이블로 분리하면 제2정규화가 진행되게 됩니다. 

 

제3정규형
제2정규형 까지 만족한 테이블을 자세히 살펴보니까, 특이한 관계를 갖는 컬럼들이 보이는데요. 바로 강사와 출신 대학 컬럼입니다. 출신대학이라는 컬럼은 프로그램이라는 PK와 아무런 관련이 없고 대신 강사라는 일반 컬럼에 종속이 되어 있는 것을 볼 수 있습니다. 이처럼 '일반 컬럼에만 종속된 컬럼을 다른 테이블로 빼기'를 수행한 것을 제3정규화 테이블이라고 합니다. 

위와 같이 일반 컬럼에 종속되는 컬럼을 별도의 테이블로 분리하는 것은 2정규화에서 얻었던 장점과 유사하게 수정의 용이성을 얻을 수 있습니다. 출신 대학이 변경되는 강사가 있다고 하면, 만약 제 3정규화를 진행하지 않았을 경우 여러 튜플들을 모두 수정해야 하지만, 3정규화를 진행하면서 딱 한 곳만 수정하면 되는 용이성을 얻을 수 있게 됩니다. 단점으로는 제2정규화와 마찬가지로 검색의 효율성이 감속합니다. 관계형 데이터베이스들은 보통 제3정규화까지 진행하는 경우가 많습니다.