1. DB설계
- 프로젝트, 명세서 등의 정보 요구사항에 대한 정확한 이해
- 분석자 개발자 사용자간의 원활한 의사소통 수단
- 데이터 중심의 분석 방법
- 현행 시스템만이 아닌 신규 시스템 개발의 기초 제공
- 설계를 대충하면 기능 한 개 추가 될 때마다 DB와 관련된 이미 개발된 프로그램도 함께 뜯어고쳐야 하는 경우가 발생한다
2. 설계를 위한 요구사항 분석
- 데이터베이스에 대한 사용자의 요구사항을 수집하고 분석해서 아래와 같이 요구사항(기능)명세서를 작성<요구사항 명세 샘플 - 항공사 DB>회원으로 가입하려면 아이디, 비밀번호, 성명, 신용카드 정보를 입력해야 함회원의 신용카드 정보는 여러 개를 저장할 수 있다.신용카드번호, 유효기간을 저장할 수 있다.회사가 보유한 비행기에 대해 비행기 번호, 출발 날짜, 출발 시간 정보를 저장하고 있다.비행기 좌석에 대한 좌석 번호, 등급 정보를 저장하고 있다.회원은 좌석을 예약하는데, 회원 한 명은 좌석을 하나만 예약할 수 있고, 한 좌석은 회원 한 명만 예약할 수 있다.
3. 개념적 설계
- 작성한 요구사항 명세서에서 데이터베이스를 구성하는데 필요한 개체, 속성, 개체 간의 관계를 추출하여 ERD를 생성
- 개체(Entity)와 속성(Attribute)을 추출한다. - 대부분 명사로 선별한다
- 개체 간의 관계(Relationship)를 추출한다. 대부분 동사로 선별한다 (개체간의 관계를 나타내는 동사이어야 한다.) 관계에 대한 속성도 있을 수 있다. 1:1, 1:N, N:M 필수적인 참여, 선택적인 참여
3.1 개체(Entity)와 속성(Attribute) 추출
- 요구사항에서 개체(Entity)는 대부분 명사로 이루어져 있지만, 속성(Attribute)과 구별하여 추출한다.
3.2 개체 간의 관계(Relationship) 추출
- 개체 간의 관계(Relationship)는 여러가지로 분류해서 정의된다.
3.3 개념 설계 기반으로 ERD 생성
4. 논리적 설계
- 모든 개체는 릴레이션(Table)으로 변환
- N : M 관계는 릴레이션(Table)으로 변환
- 1 : N 관계는 외래키로 표현
- 1 : 1 관계는 외래키로 표현
- 다중 값 속성은 독립 릴레이션(Table)으로 변환
4.1 모든 개체는 릴레이션(Table)으로 변환
- ER 다이어그램의 각 개체를 릴레이션(Table)으로 변환개체 → 테이블 속성 → 테이블의 속성
4.2 N:M 관계는 릴레이션(Table)으로 변환
- 관계 → 릴레이션 이름
- 관계속성 → 릴레이션 속성
4.3 1 : N 관계는 외래키로 표현
- 일반적으로 1:N 관계에서 1측 개체의 기본키를 N측 릴레이션에 포함시키로 외래키(FK)로 지정
4.4 1 : 1 관계는 외래키로 표현
- 일반적 1:1 관계는 외래키(FK)를 서로 주고 받는다
4.5 다중 값 속성은 독립 릴레이션(Table)으로 변환
- 릴레이션에서는 다중 값 속성을 가질 수 없으므로 다중 값 속성은 별도의 릴레이션으로 생성해야 함
5. 물리적 스키마 및 구현
- ERD를 실제 테이블로 생성한다 (Workbench 같은 DB Tool이나 SQL 스크립트 사용으로도 가능해야 함)
반정규화?
어떤 경우에 반정규화(역정규화)를 사용하는가?
1. DB 정규화?
- 데이터 모델의 중복을 최소화하고 데이터의 일관성, 유연성을 확보하기 위한 목적으로 데이터를 분해하는 과정
정규화 절차설명
제 1정규화 | 속성의 원자성을 확보하고 원자값이 아닌 도메인을 분해한다 |
제 2정규화 | 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거(분해)한다. |
제 3정규화 | 기본키를 제외한 컬럼간의 종속성을 제거한다. 즉, 이행 함수 종속성을 제거한다. |
BCNF | 기본키를 제외하고 후보키가 있는 경우 후보키가 기본키를 종속시키면 분해한다. |
제4정규화 | 여러 컬럼들이 하나의 컬럼을 종속시키는 경우 분해하여 다중값 종속성을 제거한다. |
제 5정규화 | 조인에 의해서 종속성이 발생하는 경우 분해한다. |
2. 반정규화(역정규화)란?
- 정규화된 엔티티타입, 속성, 관계를 시스템의 성능향상, 개발과 운영의 단순화를 위해 모델을 통합하는 프로세스<정규화 모델>이상적인 논리모델은 모든 엔티티타입, 속성, 관계가 반드시 한 개만 존재하며 따라서 입력, 수정, 삭제도 한군데에서만 발생하므로 데이터 값이 변질되거나 이질화 될 가능성이 없다. 반면 여러 테이블이 생성되어야 하므로 SQL작성이 용이하지 않고 과다한 테이블 조인이 발생하여 성능이 저하될 가능성이 높다.<반정규화 모델>반대로 반정규화를 하면 여러 개의 테이블이 단순해지므로 SQL작성이 용이하고 성능이 향상될 가능성이 많다. 그러나 같은 데이터가 여러 테이블에 걸쳐 존재하므로 무결성이 깨질 우려가 있다.
3. 테이블 반정규화 방법
- 1:1 관계의 테이블 병합
- 1:N 관계의 테이블 병합
- 수퍼/서브 타입 테이블 병합
- 수직 분할(집중화된 일부 컬럼을 분리)
- 수평 분할(행으로 구분하여 구간별 분리)
- 테이블 추가(중복테이블, 통계테이블, 이력케이블, 부분테이블)
4. 대표적 반정규화 - 컬럼 반정규화
- 중복컬럼 추가(자주 조회하는 컬럼이 있는 경우)
- 파생 컬럼 추가(미리 계산한 값)
- PK에 의한 컬럼 추가
- 응용시스템 오작동을 위한 컬럼 추가(이전 데이터 임시 보관)
5. 대표적 반정규화 - 관계 반정규화
- 중복 관계 추가(이미 A테이블에서 C테이블의 정보를 읽을 수 있는 관계가 있음에도 관계를 중복하여 조회(Read)경로를 단축)
6. 두 줄 요약
정규화가 좋은가 반정규화가 좋은가? 케이스 바이 케이스
정답은 정해져 있지 않고 그때그때 다르다. 개념을 잘 알고 있어야 적절하게 쓸 수 있다.
반정규화에 대해 간단하게 설명해보세요?
데이터 베이스의 성능 향상을 위하여 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법입니다.
면접에서 나오는 질문들? PK, FK왜 사용되는지