# Relational Database Design (관계형 데이터베이스 설계)
Relational Database Design은 관계형 데이터베이스 시스템(RDBMS)이 데이터를 저장, 관리, 조회하는 방식의 핵심 설계 과정을 가리킨다. 이 문서는 데이터 무결성, 일관성, 확장성, 성능의 균형을 맞추기 위한 이론과 실무를 체계적으로 정리한다.
## 개요
- 목표: 데이터를 중복 없이 효율적으로 저장하고, 무결성과 일관성을 유지하며, 다양한 쿼리 및 보고에 대해 예측 가능한 성능을 보장한다.
- 핵심 아이템: Tables, Columns, Data Types, Primary Keys, Foreign Keys, Constraints, Indexes, Transactions, Schema.
- 핵심 원리: 데이터 독립성 확보, 관계의 명확화, 무결성 제약 적용, 필요 시 Denormalization의 트레이드오프 고려.
## 데이터 모델링의 계층
- Conceptual Model: 도메인 개체(Entity)와 관계(Relationship)를 높은 수준으로 기술. 데이터베이스 독립적이다.
- Logical Model: 관계형 스키마로 매핑. 엔티티를 Tables로, 관계를 Foreign Key로 표현한다.
- Physical Model: 실제 DBMS의 물리적 구조로 구현. 저장소, 파티셔닝, 인덱스 전략 등을 포함한다.
ER 다이어그램과 같은 도구를 활용해 개념적 모델을 시각화하고, 이를 논리적 스키마로 변환하는 과정이 일반적이다.
## 정규화와 제약
- 정규화(Normalization): 데이터 중복을 최소화하고 데이터 독립성을 확보하는 절차로, 일반적으로 1NF, 2NF, 3NF를 통해 진행한다. 필요에 따라 BCNF, 4NF 등으로 확장한다.
- 1NF: 원자값(Atomic Value) 보장.
- 2NF: 후보키의 부분 함수적 의존 제거(주로 1NF 이후).
- 3NF: 이행적 함수적 의존 제거.
- Denormalization: 성능을 위해 일부 중복 데이터를 허용하는 설계 선택. 조회 성능이 큰 이점이 있지만 데이터 무결성 관리 부담이 증가한다.
- 무결성 제약(Constraints)
- Entity Integrity: Primary Key는 조합의 중복 없이 고유하고 NULL 값을 허용하지 않는다.
- Referential Integrity: 외래키(Foreign Key)가 참조하는 엔티티가 항상 존재하도록 보장한다.
- Domain Integrity: 데이터 타입, 범위, 포맷 등 컬럼의 도메인을 엄격히 정의한다.
- Check, Not Null, Unique 등의 제약을 통해 추가적인 무결성을 강화한다.
## 스키마 설계 패턴
- 1:1 관계: 두 테이블이 서로 1:1 대응. 필요 시 하나의 테이블에 합칠 수 있지만 보안/라이프사이클 분리에 따라 분리하는 경우도 있다.
- 1:N 관계: 가장 흔한 패턴. 주 테이블의 기본키를 자식 테이블의 외래키로 참조한다.
- N:M 관계: 다대다 관계는 중간(Junction/Bridge) 테이블을 통해 구현한다. 예: 학생(Student)과 수업(Course) 간의 Enrollment 테이블.
패턴 선택 시 고려사항
- 조회 쿼리의 패턴과 조인 비용
- 무결성 관리의 복잡도
- 확장성 및 파티셔닝 전략
## 스키마 구성 요소 및 제약
- Tables: 데이터의 기본 저장 단위.
- Columns: 각 속성을 저장하는 필드.
- Data Types: 적합한 데이터 타입 선택으로 저장 공간과 성능에 영향.
- Keys
- Primary Key (PK): 엔트리의 고유 식별자.
- Candidate Key: PK가 될 수 있는 대안 키.
- Foreign Key (FK): 외래 키로서 다른 테이블의 PK를 참조.
- Unique: 중복 불가 제약.
- Constraints: Not Null, Default, Check 등 데이터 무결성을 보장.
- Indexes: 검색 속도 향상을 위한 자료 구조. clustering/indexing 전략은 DBMS에 따라 다름.
- Views: 특정 쿼리 결과의 가상 테이블로, 보안 및 단순화에 활용.
- Transactions: 원자성, 일관성, 격리성, 지속성(ACID)을 보장하는 실행 단위.
## 인덱스와 성능
- 목적: 조회 및 조인 성능 개선.
- 유형: Clustered vs Non-Clustered, Covering Index, Composite Index.
- 가이드라인: 자주 필터링되거나 정렬되는 열에 인덱스를 적용하되, 인덱스 과다로 쓰기 비용 증가를 피한다.
- 파티셔닝 및 분할: 대규모 데이터에서 조회 성능과 관리 용이성을 높이는 기법.
## 트랜잭션 관리와 ACID
- 원자성(Atomicity): 트랜잭션의 연산 단위가 전체 또는 부분적으로 수행되지 않음.
- 일관성(Consistency): 데이터 무결성 규칙이 트랜잭션 전후에 유지됨.
- 고립성(Isolation): 트랜잭션 간 간섭이 최소화되며, 격리 수준에 따라 읽기 문제를 제어.
- 지속성(Durability): 성공적으로 커밋된 데이터는 시스템 장애에도 보존된다.
- 격리 수준(In Isolation Levels): Read Uncommitted, Read Committed, Repeatable Read, Serializable 등
## 물리적 설계 고려사항
- 파티셔닝(Partitioning): 데이터 양이 많을 때 성능과 관리 용이성을 위해 데이터를 여러 파티션으로 분할.
- 샤딩(Sharding): 수평적 확장을 위한 분산 저장 전략.
- 저장소 구조: 테이블의 물리적 배치 및 클러스터링 전략, 백업 및 복구 계획.
## 데이터 모델링 프로세스
1. 요구사항 분석: 도메인 도출, 엔티티와 관계 식별.
2. Conceptual 모델링: ER 다이어그램 작성.
3. Logical 데이터 모델링: 관계형 스키마로 매핑(테이블, 컬럼, 제약, 외래키 설계).
4. Physical 데이터 모델링: DBMS 특성 반영, 인덱스 설계, 파티셔닝 전략 수립.
5. 데이터 마이그레이션 및 이행: 초기 데이터 로딩 및 변경 관리.
6. 성능 튜닝 및 유지보수: 쿼리 분석, 인덱스 조정, 스키마 진화.
## 사례 연구
- 예시 1: 1:N 관계
- 개념: 고객(Customer)와 주문(Order)
- 스키마:
- Customer(CustomerID PK, Name, Email, CreatedAt)
- Order(OrderID PK, CustomerID FK -> Customer.CustomerID, OrderDate, TotalAmount)
- 특징: 주문은 하나의 고객에 속하고, 고객은 다수의 주문을 가질 수 있다.
- 예시 2: N:M 관계
- 개념: 학생(Student)과 수강(Course)
- 스키마:
- Student(StudentID PK, Name, Email)
- Course(CourseID PK, Title, Credits)
- Enrollment(StudentID FK -> Student.StudentID, CourseID FK -> Course.CourseID, EnrollmentDate, PRIMARY KEY(StudentID, CourseID))
- 특징: 학생은 여러 과목을 수강하고, 과목은 여러 학생에 의해 수강될 수 있음. 중간 테이블 Enrollment로 연결.
간단한 SQL 예시
- 테이블 생성
- CREATE TABLE Customer (
CustomerID INT PRIMARY KEY,
Name VARCHAR(100) NOT NULL,
Email VARCHAR(255) UNIQUE,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- CREATE TABLE Order (
OrderID INT PRIMARY KEY,
CustomerID INT NOT NULL,
OrderDate DATE,
TotalAmount DECIMAL(10,2),
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)
);
- 다대다 관계를 위한 중간 테이블
- CREATE TABLE Enrollment (
StudentID INT NOT NULL,
CourseID INT NOT NULL,
EnrollmentDate DATE,
PRIMARY KEY (StudentID, CourseID),
FOREIGN KEY (StudentID) REFERENCES Student(StudentID),
FOREIGN KEY (CourseID) REFERENCES Course(CourseID)
);
## 도구와 실무 팁
- 모델링 도구: ERD 도구로는 draw.io, Lucidchart, dbdiagram.io, MySQL Workbench 등을 사용.
- 데이터 타입의 차이: DBMS마다 문자열 길이, 날짜/시간 표현 방식 차이가 있으므로 이식성 고려.
- 표준화와 성능의 균형: 정규화는 무결성을 돕지만, 극단적 정규화는 조인 비용을 증가시킬 수 있음. 필요한 경우 Denormalization을 검토.
- 스키마 마이그레이션: 버전 관리 시스템을 통한 마이그레이션 스크립트 관리와 롤백 전략 수립.
## 흔한 문제점과 해결책
- 중복 데이터와 업데이트 이상: 정규화를 통해 제거하고, 필요한 경우 외래키 제약으로 참조 무결성 확보.
- 삭제 이상: ON DELETE CASCADE 여부와 트리거를 통한 무결성 관리 재검토.
- 성능 저하: 불필요한 조인을 줄이고, 필요한 영역에만 인덱스화, 파티셔닝 도입 고려.
- 스키마 변경 관리: 데이터 마이그레이션 전략 수립, 롤백 계획 마련.
## 용어집
- Table, Column, Row: 관계형 데이터의 기본 구성 요소.
- Primary Key (PK), Foreign Key (FK): 엔티티 식별 및 참조의 기본 수단.
- Normalization: 데이터 중복 제거와 데이터 무결성 확보 원칙.
- Denormalization: 성능 최적화를 위한 중복 허용 설계.
- ER Diagram: 엔티티-관계 다이어그램으로 개념 모델을 시각화.
- ACID: 트랜잭션의 네 가지 핵심 속성.
- Index: 데이터 조회 성능을 높이는 데이터 구조.
- Junction Table: 다대다(N:M) 관계를 구현하기 위한 중간 테이블.
---
관련 문서: [[데이터베이스 설계 원칙과 모범 사례]], [[정규화 이론과 실무]], [[SQL 쿼리 최적화 기법]], [[ER 다이어그램과 데이터 모델링 도구 비교]]