목 차
1. 요구사항 분석
2. 개체와 속성을 추출
3. 개체 간의 관계를 추출
4. 만들어진 개체-속성, 개체-관계를 바탕으로 개념적 설계(ERD)작성하기
5. 논리적 설계
6. 정규화
7. 물리적 설계.
DB 설계에 앞서서, 내가 구현해야할 시스템이 어떻게 처리되는지 정확히 파악해야 함!
DB 모델링은 결국 "데이터 기반의 시스템 설계".
잘못된 요구분석 -> 불완전한 모델 -> 서비스 로직 왜곡 -> 빠르게 망함.
"요구사항 분석" 은 시스템이 해결해야 할 "비즈니스 문제나 목적"을 파악하는 단계.
시스템이 필요한 이유, 목적, 핵심 프로세스를 정리하는 단계
사용자/운영자/관리자 등 이해관계자별 사용 목적 파악.
이해관계자(고객, 기획자, 마케터, 관리자 등등)의 니즈와 사용 흐름, 주요 데이터 항목, 기능 등을 명확히 해야 함. !
개발 대상에 대한 사용자의 요구사항을 이해하고 문서화 하는 활동
사용자 요구의 타당성을 조사하고 비용과 일정에 대한 제약을 설정
사용자의 요구를 정확하게 추출하여 목표를 정함.
업무의 본질적 흐름
데이터의 라이프사이클
분석 단위
Use Case 흐름, 유저 여정(시나리오 기반), BPMN, C4 Model
Excel 로 Data Matrix 구성(화면-데이터 Mapping)
이해관계자와의 Q&A 문서화
항목 | 질문 |
---|---|
데이터 소유권 | 이 데이터는 누가 최초 생성/수정/삭제하는가? |
발생 시점 | 동시성 문제가 발생할 가능성은? |
이력 필요성 | 변경 이력 추적이 필요한가? (변경 추적 테이블 분리?) |
추상화 레벨 | 화면 중심이 아니라 도메인 중심으로 재정의할 수 있는가? |
"이 데이터는 누가 생성하고 누가 관리하는가??" 이 질문을 Key로 업무 흐름을 정리
기획 무너 or 와이어프레임에서 CRUD 주체 분석.
API 계약서(Swagger, OpenAPI)가 있다면, Request/Response 구조 도출 가능
개체(Entity) : 시스템이 관리해야 할 명확한 실체 ( 고객, 주문, 상품 등)
속성(Attribute) : 해당 개체의 고유한 정보(이름, 연락처 등)
개체(엔티티: Entity) : 고객, 주문, 상품, 결제 등 "존재하고 식별 가능한 것들"
속성(Attribute) : 개체를 설명하는 데이터(ex: 상품여, 수량, 단가 등)
업무 분해 -> 명사 추출 -> 유사 항목 정제 -> 테이블 후보군으로 변환
속성은 화면의 필드(입력/출력 항목)와 메시지 구조 참고
화면 필드, API 요청/응답, 로그 데이터를 바탕으로 개체 및 속성 도출
속성의 '종류'
판단 기준 | 설계 의사결정 |
---|---|
속성은 원자값인가? | 문자열 배열 형태로 저장 시 → 별도 테이블로 분해 |
수정 빈도 높은 속성 | 물리 분리 고려 (e.g. user_profile , user_security ) |
사용량 많은 속성 | 캐싱 고려, Redis 등과의 연동성도 고려 |
관계(Relationship) : 두 개 이상의 개체 간의 연결
관계의 종류 : { 1:1, 1:N , N:M }
관계 유형 | 고려사항 |
---|---|
1:1 | 두 테이블을 나눠야 하는가? 하나로 합쳐야 하는가? → 접근 빈도 & 보안이 판단 기준 |
1\:N | 자식 테이블의 정합성 → FK 및 ON DELETE 전략 |
N\:M | 관계가 단순 연결인가? 추가 메타가 있는가? → 주문-상품 관계는 단순 관계가 아님 |
요구사항을 기반으로 개념적 모델을 구축.
개념적 모델은 엔티티와 엔티티 간의 관계를 나타내는 엔티티-관계다이어그램(ERD)으로 표현.
엔티티 간의 관계에 초점을 맞추고, 엔티티의 속성은 일반적으로 고려하지 않음.
ERD란
ERD를 통해 구조를 명확히 공유
예를 들어, "고객(Customer)"-"주문(Order)" 라는 엔티티 사이의 관계를 ERD로 표현.
ERD 도구 : dbdiagram.io, ERDCloud, MySQL Workbench, Draw.io 등
Naming Convention 적용:
항목 | 설계 지침 |
---|---|
관계 방향성 | 단방향 or 양방향 의존성 → ERD에 화살표로 명확히 표현 |
설계 명확도 | ERD는 비기술자도 이해 가능해야 한다 |
변경 이력 | ERD는 버전 관리가 되어야 한다 → Git 또는 ERD export |
테이블 정의서 작성
타입 정의 : String, Number, Date, Boolean 수준
제약 조건:
항목 | 판단 기준 |
---|---|
제약조건 전략 | FK를 실무에서 사용할 것인가? (관계 명시 vs 성능 저하) |
ID 전략 | UUID, AUTO_INCREMENT, Snowflake 중 선택 이유? |
정합성 책임 | DB vs 어플리케이션 레벨 정합성 유지 판단 |
항목 | 고려 사항 |
---|---|
인덱스 설계 | WHERE 절 조건 분석 → 복합 인덱스 설계 (선행 컬럼 고려) |
파티셔닝 | 월별 파티션? ID 범위 파티션? 로그성 테이블 관리 필요 |
이중화 | Master-Slave 구성 고려 시 Key ID 충돌 방지 전략 필요 |
마이그레이션 | Flyway/Liquibase 등으로 테이블 버전 관리 필수 |
단계 | 의미 |
---|---|
1NF | 컬럼이 원자값 |
2NF | 부분 종속 제거 |
3NF | 이행 종속 제거 |
항목 | 기준 |
---|---|
조회 성능 | 너무 많은 JOIN? → 비정규화 고려 |
이력 관리 | 변동 가능한 속성은 별도 이력 테이블로 분리 |
데이터 압축 | 수천만 Row에서 정규화 vs 압축 vs 컬럼 분할 전략 필요 |