면접을 위한 CS 전공지식 노트 - 데이터베이스의 기본/ERD와 정규화 과정

데이터베이스(DB)의 이해와 활용
데이터베이스는 일정한 규칙이나 규약에 따라 구조화되어 저장된 데이터의 모음입니다. 이러한 데이터베이스를 효과적으로 제어하고 관리하는 시스템을 DBMS(Database Management System)라고 하며, DBMS는 정의된 쿼리 언어를 통해 데이터의 삽입, 삭제, 수정, 조회 등의 작업을 수행합니다. 데이터베이스의 주요 특징 중 하나는 실시간 접근성과 동시 공유 가능성입니다.
1. 데이터베이스의 기본 구성 요소
데이터베이스를 이해하기 위해서는 다음과 같은 기본 구성 요소들에 대한 이해가 필요합니다.
1.1. 엔터티 (Entity)
엔터티는 사람, 장소, 물건, 사건, 개념과 같이 여러 개의 속성(Attribute)을 가진 명사적 대상을 의미합니다. 각 엔터티의 속성은 해당 서비스의 구체적인 요구 사항에 따라 결정됩니다.
강한 엔터티와 약한 엔터티:
강한 엔터티 (Strong Entity): 다른 엔터티의 존재 여부와 관계없이 독립적으로 존재할 수 있는 엔터티입니다.
약한 엔터티 (Weak Entity): 다른 엔터티(강한 엔터티)의 존재에 의존하여 존재하는 엔터티입니다. 예를 들어, 특정 엔터티 B가 있어야만 엔터티 A가 존재할 수 있다면, A는 약한 엔터티, B는 강한 엔터티가 됩니다.
1.2. 릴레이션 (Relation)
릴레이션은 데이터베이스 내에서 정보를 구분하여 저장하는 기본적인 단위입니다. 특정 엔터티에 관한 데이터는 하나의 릴레이션에 담겨 관리됩니다.
용어 비교:
관계형 데이터베이스 (RDBMS): 릴레이션을 테이블(Table)이라고 부릅니다. (예: MySQL)
NoSQL 데이터베이스: 릴레이션을 컬렉션(Collection)이라고 부릅니다. (예: MongoDB)
MySQL은 '레코드(Record) - 테이블(Table) - 데이터베이스(Database)' 구조를, MongoDB는 '도큐먼트(Document) - 컬렉션(Collection) - 데이터베이스(Database)' 구조를 가집니다.
1.3. 속성 (Attribute)
속성은 릴레이션(테이블 또는 컬렉션)에서 관리하는 구체적이고 고유한 이름을 가진 정보 항목입니다. 예를 들어 '자동차'라는 엔터티가 있다면, '차량 번호', '바퀴 수', '색상', '차종' 등이 속성이 될 수 있으며, 이 중 서비스 요구 사항에 따라 필요한 속성만 선택되어 관리됩니다.
1.4. 도메인 (Domain)
도메인은 릴레이션에 포함된 각 속성이 가질 수 있는 값들의 집합을 의미합니다. 예를 들어 '성별'이라는 속성이 있다면, 해당 속성의 도메인은 {'남', '여'}와 같은 집합으로 정의될 수 있습니다.
1.5. 필드 (Field) 와 레코드 (Record)
필드 (Field): 테이블을 구성하는 열(column)에 해당하며, 각 속성을 나타냅니다. 예를 들어 '회원' 테이블은 '이름', '아이디', '주소' 등의 필드를 가질 수 있습니다.
레코드 (Record): 테이블에 저장되는 행(row) 단위의 데이터를 의미하며, 튜플(Tuple)이라고도 합니다. 각 레코드는 하나의 엔터티 인스턴스에 대한 정보를 담고 있습니다.
1.6. 필드 타입 (Field Type)
필드는 저장되는 데이터의 종류에 따라 특정 타입을 가집니다. DBMS마다 지원하는 타입이 다르며, 여기서는 MySQL을 기준으로 주요 타입을 설명합니다.
숫자 타입 (Numeric Types):
TINYINT:
SMALLINT:
MEDIUMINT:
INT:
BIGINT:
날짜/시간 타입 (Date/Time Types):
DATE: 날짜 정보만 저장 (YYYY-MM-DD). 3바이트. (범위: 1000-01-01 ~ 9999-12-31)
DATETIME: 날짜와 시간 정보 모두 저장. 8바이트. (범위: 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59)
TIMESTAMP: 날짜와 시간 정보 모두 저장. 4바이트. (범위: 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 UTC)
문자 타입 (String Types):
CHAR(길이): 고정 길이 문자열. 지정된 길이(0~255)만큼 공간을 차지합니다. 길이가 고정적인 데이터에 효율적입니다. (예: CHAR(100)에 10글자 저장 시 100바이트 사용)
VARCHAR(길이): 가변 길이 문자열. 실제 입력된 데이터의 길이에 따라 공간을 차지합니다 (0~65,535). 길이가 유동적인 데이터에 효율적입니다. (예: VARCHAR(100)에 10글자 저장 시 약 11바이트 사용 - 실제 데이터 + 길이 정보)
TEXT: 매우 큰 문자열 저장에 사용 (예: 게시판 본문).
BLOB: 이미지, 동영상 등 대용량 바이너리 데이터 저장에 사용. 그러나 실제로는 S3와 같은 외부 저장소에 파일을 저장하고 경로만 VARCHAR로 저장하는 방식이 흔합니다.
ENUM: 미리 정의된 문자열 값 중 하나만 선택 가능. 내부적으로 정수로 매핑되어 메모리 효율이 좋음 (최대 65,535개 요소). 정의되지 않은 값 입력 시 빈 문자열 저장.
SET: ENUM과 유사하나, 여러 값 선택 가능 (최대 64개 요소). 비트 단위 연산 지원.
ENUM/SET 사용 시 주의점: 애플리케이션 변경 시 DB의 ENUM/SET 목록도 수정해야 하는 번거로움이 있습니다.
1.7. 테이블 간의 관계 (Relationships)
데이터베이스는 여러 테이블로 구성되며, 이 테이블들은 서로 관계를 맺고 있습니다. 관계는 주로 관계 화살표로 표현됩니다.
1:1 관계 (One-to-One): 두 테이블의 레코드가 일대일로 매칭되는 관계. 테이블 구조를 더 명확하게 분리할 때 사용됩니다.
1:N 관계 (One-to-Many): 하나의 테이블 레코드가 다른 테이블의 여러 레코드와 관계를 맺는 경우. (예: 한 명의 유저는 여러 개의 상품을 장바구니에 담을 수 있음. 0개의 경우도 포함)
N:M 관계 (Many-to-Many): 양쪽 테이블의 레코드가 서로 다대다 관계를 맺는 경우. (예: 한 명의 학생은 여러 강의를 수강하고, 하나의 강의는 여러 학생을 포함) N:M 관계는 직접 연결하지 않고, 중간에 매개 테이블(Junction Table)을 두어 두 개의 1:N 관계로 분해하여 구현합니다.
1.8. 키 (Keys)
키는 테이블 간의 관계를 명확히 하고, 데이터의 유일성을 보장하며, 검색 속도 향상을 위한 인덱싱에 활용되는 중요한 장치입니다.
유일성 (Uniqueness): 키 값이 테이블 내에서 중복되지 않음을 의미합니다.
최소성 (Minimality): 키를 구성하는 속성의 수가 최소화되어, 더 이상 줄일 수 없는 상태를 의미합니다.
슈퍼키 (Super Key): 테이블 내의 각 레코드를 유일하게 식별할 수 있는 하나 이상의 속성 집합. (유일성 O, 최소성 X)
후보키 (Candidate Key): 슈퍼키 중에서 최소성까지 만족하는 속성 또는 속성 집합. 기본키가 될 수 있는 후보들입니다. (유일성 O, 최소성 O)
기본키 (Primary Key, PK): 후보키 중에서 선택된 단 하나의 키. 테이블의 각 레코드를 고유하게 식별하며, NULL 값을 가질 수 없고 중복되어서는 안 됩니다. (유일성 O, 최소성 O)
자연키 (Natural Key): 비즈니스 로직 상 자연스럽게 발생하는 고유한 속성 (예: 주민등록번호). 변할 가능성이 있습니다.
현재 법적으로 주민등록번호를 사내에 저장할 수 없기 때문에 한때 이를 마이그레이션 하는 작업이 빈번했습니다.인조키 (Artificial Key / Surrogate Key): 데이터베이스에서 인위적으로 생성하는 고유 식별자 (예: Auto Increment ID, Sequence). 변하지 않는 특성 때문에 주로 기본키로 사용됩니다.
복합키 (Composite Key): 두 개 이상의 속성을 조합하여 기본키로 사용하는 경우. 이 경우 개별 속성은 최소성을 만족하지 않을 수 있습니다.
대체키 (Alternate Key): 후보키가 여러 개일 때, 기본키로 선택되지 않은 나머지 후보키들을 의미합니다.
외래키 (Foreign Key, FK): 다른 테이블의 기본키를 참조하는 속성. 테이블 간의 관계를 맺고 데이터 무결성을 보장하는 데 사용됩니다. 외래키 값은 참조하는 테이블의 기본키 값이거나 NULL일 수 있으며, 중복될 수 있습니다.
2. ERD (Entity Relationship Diagram) 와 정규화 (Normalization)
2.1. ERD의 개념과 중요성
ERD는 엔터티(개체)와 엔터티 간의 관계(Relationship)를 시각적으로 표현한 다이어그램입니다. 데이터베이스 설계의 가장 기초적인 뼈대로, 서비스 구축 시 가장 먼저 고려되어야 할 부분입니다.
역할:
시스템 요구 사항을 기반으로 데이터베이스 구조를 설계합니다.
데이터베이스 구축 후 디버깅이나 비즈니스 프로세스 변경 시 설계도 역할을 합니다.
한계: ERD는 관계형 데이터 모델에 적합하지만, 비정형 데이터(미리 정의된 모델이 없거나 특정 방식으로 정리되지 않은 정보)를 충분히 표현하기에는 어려움이 있습니다.
2.2. 정규화 과정 (Normalization Process)
정규화는 릴레이션(테이블) 간의 잘못된 종속 관계로 인해 발생할 수 있는 데이터베이스 이상 현상(Anomaly)을 해결하고, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정입니다.
데이터베이스 이상 현상: 데이터 중복으로 인해 발생하며, 다음과 같은 종류가 있습니다.
삽입 이상 (Insertion Anomaly): 불필요한 데이터 없이는 특정 데이터를 삽입할 수 없는 경우 (예: 아직 강의를 수강하지 않는 학생 정보를 입력하려 할 때, 수강 정보 필드가 NULL이 될 수 없어 학생 정보 자체를 삽입 못 하는 경우).
삭제 이상 (Deletion Anomaly): 특정 정보를 삭제하면, 원치 않는 다른 정보까지 함께 삭제되는 경우 (예: 특정 학생의 수강 취소 시, 해당 강의 정보까지 삭제되는 경우).
갱신 이상 (Update Anomaly): 중복된 데이터 중 일부만 수정되어 데이터 불일치가 발생하는 경우 (예: 학생 주소 변경 시, 해당 학생의 모든 레코드에서 주소를 변경하지 않으면 데이터가 일관되지 않는 경우). (본문에서는 명시적으로 갱신 이상이 언급되진 않았으나, 데이터베이스 이상 현상의 대표적인 예시로 포함)
정규화는 정규형(Normal Form, NF) 원칙을 기반으로 진행되며, 정규화된 정도를 정규형으로 표현합니다.
정규형 원칙:
같은 의미를 표현하되 더 좋은 구조로 만든다.
자료의 중복성을 줄인다.
독립적인 관계는 별개의 릴레이션으로 표현한다.
각 릴레이션은 독립적인 표현이 가능해야 한다.
주요 정규형 단계:
제1정규형 (1NF): 릴레이션의 모든 속성 값이 원자 값(Atomic Value)으로만 구성되어야 합니다. 즉, 하나의 속성 값이 여러 개의 값을 가지는 반복 집합이 있어서는 안 됩니다.
제2정규형 (2NF): 제1정규형을 만족하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속(Full Functional Dependency)되도록 합니다. 즉, 기본키의 일부에만 종속되는 부분 함수 종속(Partial Functional Dependency)을 제거합니다. 분해 시 정보 손실이 없는 무손실 분해(Lossless Decomposition)가 되어야 합니다.
제3정규형 (3NF): 제2정규형을 만족하고, 기본키가 아닌 속성들이 기본키에 대해 이행적 함수 종속(Transitive Functional Dependency) 관계를 가지지 않도록 합니다.
이행적 함수 종속: A → B 이고 B → C 일 때, A → C 가 성립하며 C가 A에 직접 종속되지 않고 B를 통해 간접적으로 종속되는 경우.
보이스/코드 정규형 (BCNF): 제3정규형을 만족하고, 모든 결정자(Determinant)가 후보키여야 합니다. 즉, 결정자이면서 후보키가 아닌 함수 종속 관계를 제거합니다.
결정자: 함수 종속 관계 X → Y 에서 X를 의미합니다. (Y는 종속자)
BCNF는 특히 복합 후보키가 존재하고, 이들 후보키들이 서로 중첩되는 경우에 제3정규형보다 더 강력한 제약 조건을 제공합니다. (예시: {학번, 수강명} → 강사, 강사 → 수강명 에서 '강사'가 결정자이지만 후보키가 아닐 때, 이를 분리하여 이상 현상을 해결 )
정규화와 성능: 정규화 과정을 거쳐 테이블을 나누면 데이터 중복 감소 및 일관성 향상의 장점이 있지만, 과도한 정규화는 테이블 간 조인(JOIN) 연산을 증가시켜 오히려 쿼리 성능을 저하시킬 수 있습니다. 따라서 서비스의 특성과 요구 사항에 따라 적절한 수준의 정규화 또는 의도적인 비정규화(Denormalization)를 선택해야 합니다.
핵심 포인트
1. 데이터베이스 기본 용어
데이터베이스(DB): 구조화된 데이터 모음. DBMS를 통해 관리.
엔터티(Entity): 여러 속성을 가진 명사적 대상 (강한 엔터티/약한 엔터티 구분).
릴레이션(Relation): 정보 저장 기본 단위 (RDBMS: 테이블, NoSQL: 컬렉션).
속성(Attribute): 릴레이션에서 관리하는 고유한 정보 항목.
도메인(Domain): 속성이 가질 수 있는 값의 집합.
필드(Field) & 레코드(Record): 필드는 열(속성), 레코드는 행(튜플, 데이터).
필드 타입: 데이터 종류에 따라 숫자, 날짜/시간, 문자(CHAR, VARCHAR, TEXT, BLOB, ENUM, SET) 등 다양한 타입을 가짐.
테이블 관계: 1:1, 1:N, N:M 관계로 정의 (N:M은 중간 테이블로 분해).
2. 키 (Keys) 의 종류와 역할
슈퍼키: 유일성 만족.
후보키: 유일성 + 최소성 만족. 기본키 후보.
기본키(PK): 후보키 중 선택. 레코드 고유 식별 (자연키/인조키 중 선택, 주로 인조키 사용).
대체키: 기본키로 선택되지 않은 후보키.
외래키(FK): 다른 테이블의 기본키 참조. 관계 설정 및 데이터 무결성 유지.
3. ERD (Entity Relationship Diagram)
데이터베이스 구조를 시각화한 설계도. 시스템 요구 사항 기반 작성.
관계형 데이터 구성에 유용하나, 비정형 데이터 표현에는 한계.
4. 정규화 (Normalization)
데이터 중복성 감소, 이상 현상 해결, 저장 공간 효율화를 위해 릴레이션을 분리하는 과정.
이상 현상: 삽입, 삭제, 갱신 이상.
정규형 원칙: 더 좋은 구조, 중복 감소, 독립적 관계 분리, 독립적 표현 가능.
주요 정규형:
1NF: 모든 속성 값은 원자 값.
2NF: 1NF + 부분 함수 종속 제거 (완전 함수 종속).
3NF: 2NF + 이행적 함수 종속 제거.
BCNF: 3NF + 모든 결정자가 후보키.
성능 고려: 과도한 정규화는 조인 증가로 성능 저하를 유발할 수 있으므로, 서비스 특성에 따라 비정규화도 고려.
출처
면접을 위한 CS 전공지식 노트