Project DB 설계
DB 설계의 목적
- 프로젝트, 명세서 등의 정보 요구사항에 대한 정확한 이해
- 분석자, 개발자, 사용자간의 원활한 의사소통 수단
- 데이터 중심의 분석 방법
- 현행 시스템만이 아닌 신규 시스템 개발의 기초 제공
설계를 대충하면 기능 한 개 추가 될 때마다 DB와 관련된 이미 개발된 프로그램도 함께 뜯어고쳐야 하는 경우가 있다. 설계를 꼼꼼히 하자!
1. 설계를 위한 요구사항 분석
- 요구사항 기능 명세서 작성
- 데이터베이스에 대한 사용자의 요구사항을 수집하고 분석
2. 개념적 설계
- 개체(Entity) 속성(Attribure) 추출 - 명사
- 개체 간의 관계 추출 - 동사
- 개체와 속성 추출
- 객체는 대부분 명사로 이루어져 있으나 속성과 구별하여 추출한다
- 개체 간의 관계 추출
- 개체 간의 관계는 여러가지로 분류해서 정의된다
3. 논리적 설계
- 모든 개체는 릴레이션 으로 변환
- ERD 각 개체를 릴레이션으로 변환
- N:M 관계는 릴레이션으로 변환
- 관계 ⇒ 릴레이션 이름
- 관계 속성 ⇒ 릴레이션 속성
- 1: N 관계는 외래기로 표현
- 1측 개체의 기본키를 N 측 릴레이션에 포함
- 1측 개체의 기본키는 외래키로 지정
- 1:1 관계는 외래키로 표현
- 다중값 속성은 독립된 릴레이션으로 표현
4. 물리적 스키마 및 구현
- Workbench 같은 DB 툴이나 SQL 스크립트 사용으로 ERD를 실제 테이블로 생성한다.
반정규화
1. DB 정규화
- 데이터 모델의 중복을 최소화하고 데이터의 일관성, 유연성을 확보하기 위한 목적으로 데이터를 분해하는 과정
제 1정규화 | 속성의 원자성을 확보하고 원자값이 아닌 도메인을 분해한다 |
제 2정규화 | 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거(분해)한다. |
제 3정규화 | 기본키를 제외한 컬럼간의 종속성을 제거한다. 즉, 이행 함수 종속성을 제거한다. |
BCNF | 기본키를 제외하고 후보키가 있는 경우 후보키가 기본키를 종속시키면 분해한다. |
제4정규화 | 여러 컬럼들이 하나의 컬럼을 종속시키는 경우 분해하여 다중값 종속성을 제거한다. |
제 5정규화 | 조인에 의해서 종속성이 발생하는 경우 분해한다. |
2. 반정규화
- 정규화된 엔티티타입, 속성, 관계를 시스템의 성능향상, 개발과 운영의 단순화를 위해 모델을 통합하는 프로세스
- 같은 데이터가 여러 테이블에 걸쳐 존재하므로 무결성이 깨질 우려가 있다.
- 적당한 수준의 타협이 필요하다.
3. 테이블 반정규화 방법
- 1:1 관계 / 1:N 관계의 테이블병합
- 수퍼/ 서브 타입 테이블 병합
- 수직 / 수평분할
- 테이블 추가
4. 대표적 반정규화 - 컬럼 반정규화
- 중복컬럼 추가 (자주 조회하는 컬럼이 있는 경우)
- 파생 컬럼추가 (미리 계산한 값)
- PK에 의한 컬럼 추가
- 응용시스템 오작동을 위한 컬럼추가(이전데이터 임시보관)
5. 대표적 반정규화 - 관계 반정규화
- 중복관계추가 - 관계를 중복해서 조회경로를 단축
⇒ 정규화? 반정규화? “case by case”
⇒ 반정규화는 데이터 중복을 허용하고 조인을 줄이는 데이터베이스의 성능향상 방법
⇒ 반정규화도 DB튜닝의 한 방법이다.