정규화 & 비정규화
정규화 VS 비정규화(반정규화) 데이터베이스
정규화 데이터베이스
- 정규화 데이터베이스(Normalized Database)는
중복을 최소화하도록 설계된 데이터베이스를 말함
- 같은 데이터는 데이터베이스 내에 하나 정도만 놓으려고 노력
- 하지만 상당수의 일상적 질의를 처리하기 위해 조인을 많이 하게 되는 단점이 있음
비정규화 데이터베이스
- 비정규화 데이터베이스(Denormalized Database)는
읽는 시간을 최적화하도록 설계된 데이터베이스를 말함
- 관계형 데이터베이스(Relational Database)를 사용하는 경우, JOIN 연산의 비용을 줄일 수 있음
- 비정규화는 높은 규모 확장성을 실현하기 위해 자주 사용되는 기법
비정규화란 무엇인가?
- 하나 이상의 테이블에 데이터를 중복해 배치하는 최적화 기법
- 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로, 의도적으로 정규화 원칙을 위배하는 행위
- 예를 들어,
Courses
와 Teachers
라는 테이블로 이루어진 정규화된 데이터베이스를 생각해 볼 때
Courses
테이블에는 teacherlD
를 둘 수는 있어도, teacherName
이라는 필드를 두지는 않을 것
- 따라서 강좌 정보와 교사 이름을 함께 나열하고 싶은 경우에는 두 테이블을 조인해야 함
- 어떤 면에서는 멋진 방법인데 교사가 자신의 이름을 바꿀 경우, 한 곳의 데이터만 갱신하면 됨
- 하지만 이 방법의 단점은 테이블이 아주 클 경우 조인을 하느라 불필요할 정도로 많은 시간을 낭비하게 된다는 것
- 비정규화는 다른 타협안을 내놓음으로써 그런 단점을 해소하고자 함
- 어느 정도의 데이터 중복이나 그로 인해 발생하는 데이터 갱신 비용은 감수하는 대신 조인 횟수를 줄여 한층 효율적인 쿼리를 날릴 수 있도록 하겠다는 것
장점
- 빠른 데이터 조회
- 살펴볼 테이블이 줄어들기 때문에 데이터 조회 쿼리가 간단해짐
단점
- 데이터 갱신이나 삽입 비용이 높음
- 데이터 갱신 또는 삽입 코드를 작성하기 어려워짐
- 데이터 간의 일관성이 깨어질 수 있음
- 데이터를 중복하여 저장하므로 더 많은 저장 공간이 필요
비정규화 대상
- 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
- 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
- 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우
Tip!
- 대부분의 대규모 IT 업체의 경우처럼 규모 확장성(Scalability)을 요구하는 시스템의 경우 거의 항상 정규화된 데이터베이스와 비정규화된 데이터베이스를 섞어 사용
주의점
- 반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있음
- 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있음
Tip! 중복된 정보로 인해 발생하는 문제들을 이상 현상(Anomaly)이라고 함
- 삽입 이상(Insertion Anomaly) : 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점을 말함
- 삭제 이상(Deletion Anomaly) : 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말함
- 갱신 이상(Modification Anomaly) : 정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점을 말함
- 이상 현상은 정규화를 통해 방지할 수 있음
정규화란 무엇인가?
- 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업
- 좀 더 구체적으로는 하나의 종속성이 하나의 릴레이션에 표현될 수 있도록 분해해가는 과정
- 한 릴레이션에 여러 데이터의 속성들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 됨
- 또한 중복된 정보로 인해 '갱신 이상'이 발생하게 됨
- 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것
- 이러한 문제를 해결하기 위해 정규화 과정을 거침
- 정규화 과정을 거치게 되면 정규형을 만족하게 됨
- 정규형
- 특정 조건을 만족하는 릴레이션의 스키마의 형태
- 제1 정규형, 제2 정규형, 제3 정규형, BCNF형, 제4 정규형, 제5 정규형이 존재
- 차수가 높아질수록 만족시켜야 할 제약 조건이 늘어남
장점
- 데이터베이스 변경 시 이상 현상 (Anomaly) 제거
- 저장 공간의 최소화 가능
- 효과적인 검색 알고리즘 생성 가능
- 데이터 삽입 시 릴레이션 재구성의 필요성 감소
- 데이터 구조의 안정성 및 무결성 유지
단점
정규화의 원칙
- 정보의 무손실 표현
- 하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있어서는 안됨
- 분리의 원칙
- 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리시켜 표현해야 함
- 데이터의 중복성이 감소되어야 함
함수적 종속 (Functional Dependency)
- 데이터들이 어떤 기준값에 의해 종속되는 것을 의미
- 예를 들어 <수강> 릴레이션이 (
학번 이름, 과목명
)으로 되어 있을 때, '학번'이 결정되면 '과목명’에 상관없이 '학번'에는 항상 같은 '이름'이 대응
- '학번'에 따라 '이름'이 결정될 때 '이름'을 '학번'에 함수 종속적이라고 하며
학번 → 이름
과 같이 됨
- 완전 함수적 종속
- 완전 함수적 종속은 어떤 속성이 기본키에 대해 완전히 종속적일 때를 말함
- 어떤 테이블 에서 속성 A가 다른 속성 집합 B 전체에 대해 함수적 종속이지만 속성 집합 B의 어떠한 진부분 집합 C(즉,
C ⊂ B
)에는 함수적 종속이 아닐 때 속성 A는 속성 집합 B에 완전 함수적 종속이라고 함
- 부분 함수적 종속
- 어떤 테이블 R에서 속성 A가 다른 속성 집합 B 전체에 대해 함수적 종속이면서 속성 집합 B의 어떠한 진부분 집합에도 함수적 종속일 때 속성 A는 속성 집합 B에 부분 함수적 종속이라고 함
Tip!
- 예를 들어 <수강> 릴레이션이 (
학번, 과목명, 성적, 학년
)으로 되어 있고 (학번, 과목명
)이 기본키일 때
- '성적'은 '학번'과 '과목명’이 같을 경우에는 항상 같은 '성적'이 옴
- 즉, '성적'은 '학번'과 '과목명’에 의해서만 결정되므로 '성적'은 기본키(
학번, 과목명
)에 완전 함수적 종속이 되는 것
- 반면에 '학년'은 '과목명'에 관계없이 '학번'이 같으면 항상 같은 '학년'이 온다.
- 즉, 기본키의 일부인 '학번'에 의해서 '학년'이 결정되므로 '학년'은 부분 함수적 종속이라고 함