CS지식

DB 설계

hminor 2023. 6. 1. 13:40

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왜 사용되는지

'CS지식' 카테고리의 다른 글

JIRA란?  (0) 2023.06.01
정규표현식  (0) 2023.06.01
GIT & JIRA  (0) 2023.06.01
서비스 플랫폼  (0) 2023.06.01
인프라_Infra  (0) 2023.06.01