[Daily Contents] Project DB설계


1. DB 설계의 목적

- 프로젝트, 명세서 등의 정보 요구사항에 대한 정확한 이해
- 분석자, 개발자, 사용자 간의 원활한 의사소통 수단
- 데이터 중심의 분석 방법
- 현행 시스템만이 아닌 신규 시스템 개발의 기초 제공
  • 설계를 대충 하면 기능 한 개 추가될 때마다 DB와 관련된 이미 개발된 프로그램도 함께 뜯어고쳐야 하는 경우가 발생한다.

2. 설계를 위한 요구사항 분석

- 데이터베이스에 대한 사용자의 요구사항을 수집하고 분석해서 요구사항 기능 명세서를 작성

3. 개념적 설계

- 작성한 요구사항 명세서에서 데이터베이스를 구성하는데 필요한 개체, 속성, 개체 간의 관계를 추출하여 ERD를 생성
1. 개체와 속성을 추출한다.
a. 대부분 명사로 선별한다.
2. 개체 간의 관계를 추출한다.
a. 대부분 동사로 선별한다.
b. 관계에 속한 속성도 있을 수 있다.
c. 1:1, 1:N, N:M
d. 필수적인 참여, 선택적인 참여

3-1. 개체와 속성

- 요구사항에서 개체는 대부분 명사로 이루저여 있지만, 속성과 구별하여 추출한다.

3-2. 개체 간의 관계

- 개체 간의 관계는 여러가지로 분류해서 정의된다.

3-3. 개념 설계 기반으로 ERD 생성

4. 논리적 설계

- 모든 개쳬는 릴레이션(Table)으로 변환
- N:M 관계는 릴레이션으로 변환
- 1:N 관계는 외래키로 표현
- 1:1 관계는 외래키로 표현
- 다중 값 속성은 독립 릴레이션으로 변환

4-1. 모든 개체는 릴레이션으로 변환

4-2. N:M 관계는 릴레이션으로 변환

4-3. 1:N 관계는 외래키(FK)로 표현

- 일반적으로 1:N 관계에서 1측 개체의 기본키를 N측 릴레이션에 포함시키고 외래키(FK)로 지정

4-4. 1:1 관계는 외래키로 표현

- 일반적 1:1 관계는 외래키(FK)를 서로 주고 받는다.

4-5. 다중값 속성은 독립 릴레이션으로

- 릴레이션에서는 다중 값 속성으로 가질 수 없으므로 다중값 속성은 별도의 릴레이션으로 생성해야 함.

5. 물리적 스키마 및 구현

- ERD를 실제 테이블로 생성한다.(Workbench 같은 DB Tool이나 SQL 스크립트 사용으로도 가능해야 함)

반정규화란?

** 정규화된 엔티티타입, 속성, 관계를 시스템의 성능 향상, 개발과 운영의 단순화를 위해 모델을 통합하는 프로세스 **

** 정규화 모델 **
- SQL 작성이 용이하지 않고 과다한 테이블 조인이 발생하여 성능이 저하될 가능성이 높다.
** 반정규화 모델 **
- 같은 데이터가 여러 테이블에 걸쳐 존재하므로 무결성이 깨질 우려가 있다.
- 하지만 성능을 더 중시한다면 고려해 볼 만한 선택지.

테이블 반정규화 방법

- 1:1 관계의 테이블 병합
- 1:N 관계의 테이블 병합
- 슈퍼/서브 타입 테이블 변환
- 수직 분할(집중화된 일부 컬럼을 분리)
- 수평 분할(행으로 구분하여 구간별 분리)
- 테이블 추가(중복 테이블, 통계 테이블, 이력 케이블, 부분 테이블)

대표적 반정규화 - 컬럼 반정규화

- 중복 컬럼 추가(자주 조회하는 컬럼이 있는 경우)
- 파생 컬럼 추가(미리 계산한 값)
- PK에 의한 컬럼 추가
- 응용시스템 오작동을 위한 컬럼 추가(이전데이터 임시 보관)

대표적 반정규화 - 관계 반정규화

- 중복 관계 추가(이미 A 테이블에서 C 테이블의 정보를 읽을 수 있는 관계가 있음에도 관계를 중복하여 조회 경로를 단축)

정규화가 좋은가 반정규화가 좋은가?

** 정답은 정해져 있지 않고 그때그떄 다르다. 개념을 잘 알고 있어야 적절하게 쓸 수 있다. **

Quiz(정리)

  • 면접관 Q. 반정규화에 대해 간단하게 설명해 보세요.
  • 지원자 ** A. 데이터베이스의 성능 향상을 위하여, 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법입니다. **

Q&A

  • Q. 수평 분할과 인덱스는 데이터 접근을 빠르게 하는 원리가 동일한 듯한데 어느 면에서 차이점이 있는지?
  • A. 필드가 굉장히 많이 늘어나는 경우가 있다. 이런 경우인데도 특정 부분만 조회하게 되는 경우가 있는데, 이런 조회를 반복하면 메모리에 부하가 늘어나게 된다. 그래서 여기서 가장 많이 쓰는 필드만을 추출해서 사용한다. 즉, 속도와 퍼포먼스를 위해 수평 분할을 하는 것.

댓글남기기