# 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 다이어그램과 데이터 모델링 도구 비교]]