2025-08-10 10:17

Tags:

데이터베이스 스키마 핸드북

1. 만들어진 이유: 데이터 세계의 청사진

데이터베이스 스키마는 데이터를 체계적으로 저장하고 관리하기 위한 설계도입니다. 마치 건물을 짓기 전에 설계도가 필요한 것처럼, 데이터베이스를 구축하기 전에 데이터가 어떤 구조로, 어떤 관계를 맺으며, 어떤 제약 조건 하에 저장될지 명확하게 정의하는 것이 중요합니다.

스키마가 없다면 데이터는 아무런 규칙 없이 뒤섞여 저장될 것입니다. 이는 다음과 같은 문제를 야기합니다.

  • 데이터 중복: 같은 정보가 여러 곳에 저장되어 저장 공간을 낭비하고 데이터 일관성을 해칩니다.

  • 데이터 불일치: 한 곳의 정보는 수정되었지만 다른 곳은 그대로 남아 데이터 신뢰도가 떨어집니다.

  • 검색 및 관리의 어려움: 원하는 데이터를 찾거나 수정하기가 매우 힘들어집니다.

스키마는 이러한 혼란을 막고, 데이터의 무결성, 일관성, 효율성을 보장하는 핵심적인 역할을 합니다.

2. 구조: 스키마의 구성 요소

데이터베이스 스키마는 크게 세 가지 수준으로 나눌 수 있습니다.

  • 외부 스키마 (External Schema / View):

    • 개념: 개별 사용자나 응용 프로그램이 보는 데이터베이스의 모습. 전체 데이터베이스 중에서 특정 부분만을 보여주는 ‘창문’과 같습니다.

    • 목적: 사용자의 편의성과 보안을 위해 만들어집니다. 예를 들어, 영업팀에게는 고객 정보와 주문 내역만 보여주고, 인사팀에게는 직원의 개인 정보와 급여 정보만 보여주는 식입니다.

  • 개념 스키마 (Conceptual Schema):

    • 개념: 데이터베이스의 전체적인 논리적 구조. 모든 데이터, 데이터 간의 관계, 제약 조건 등을 포괄적으로 정의한 ‘전체 설계도’입니다. 데이터베이스 관리자(DBA)가 주로 다루는 영역입니다.

    • 구성 요소:

      • 개체 (Entity): 저장하려는 데이터의 대상 (예: 학생, 과목, 교수)

      • 속성 (Attribute): 각 개체가 갖는 특성 (예: 학생의 학번, 이름, 학년)

      • 관계 (Relationship): 개체들 사이의 연관성 (예: 학생은 과목을 ‘수강한다’)

      • 제약 조건 (Constraint): 데이터가 지켜야 할 규칙 (예: 학번은 중복될 수 없다, 학년은 1~4 사이의 숫자여야 한다)

  • 내부 스키마 (Internal Schema):

    • 개념: 데이터가 물리적인 저장 장치(하드디스크 등)에 실제로 어떻게 저장되는지를 정의. 데이터의 저장 방식, 인덱스, 파일 구조 등을 다루는 ‘시공 설계도’에 해당합니다.

    • 목적: 데이터베이스의 성능과 효율성을 최적화하는 데 중점을 둡니다.

3. 사용법: 스키마 설계와 정의

스키마를 생성하고 관리하는 과정은 주로 **데이터 정의 언어(DDL, Data Definition Language)**를 통해 이루어집니다. 가장 대표적인 DDL은 SQL(Structured Query Language)입니다.

스키마 설계 과정

  1. 요구사항 분석: 어떤 데이터를 저장하고 관리할 것인지 명확히 합니다.

  2. 개념적 설계: 개체-관계 다이어그램(ERD) 등을 사용하여 데이터와 그 관계를 시각적으로 모델링합니다.

  3. 논리적 설계: 개념적 모델을 특정 데이터베이스 모델(주로 관계형 모델)에 맞게 변환합니다. 테이블, 컬럼, 기본 키(Primary Key), 외래 키(Foreign Key) 등을 정의합니다.

  4. 물리적 설계: 논리적 설계를 바탕으로 실제 저장 구조와 성능 최적화 방안을 결정합니다.

SQL을 이용한 스키마 정의 예시

학생 정보를 관리하는 간단한 테이블을 만든다고 가정해 보겠습니다.

-- 'students' 테이블 생성
CREATE TABLE students (
    student_id INT PRIMARY KEY,  -- 학번 (기본 키, 중복 불가)
    student_name VARCHAR(100) NOT NULL, -- 이름 (빈 값 불가)
    major VARCHAR(50), -- 전공
    grade INT CHECK (grade >= 1 AND grade <= 4) -- 학년 (1~4 사이 값만 허용)
);

-- 'courses' 테이블 생성
CREATE TABLE courses (
    course_id VARCHAR(10) PRIMARY KEY, -- 과목 코드 (기본 키)
    course_name VARCHAR(100) NOT NULL, -- 과목명
    credits INT NOT NULL -- 학점
);

-- 수강 정보를 관리하는 'enrollments' 테이블 생성
CREATE TABLE enrollments (
    enrollment_id INT PRIMARY KEY,
    student_id INT, -- 학생 ID (외래 키)
    course_id VARCHAR(10), -- 과목 코드 (외래 키)
    FOREIGN KEY (student_id) REFERENCES students(student_id), -- students 테이블의 student_id 참조
    FOREIGN KEY (course_id) REFERENCES courses(course_id) -- courses 테이블의 course_id 참조
);

위 예시는 students, courses, enrollments라는 세 개의 테이블을 정의하고, 각 테이블의 컬럼(속성)과 데이터 타입, 제약 조건을 명시합니다. 또한, enrollments 테이블은 studentscourses 테이블을 외래 키로 참조하여 관계를 맺고 있습니다.

4. 심화 내용: 정규화와 스키마 진화

  • 정규화 (Normalization): 데이터의 중복을 최소화하고 일관성을 높이기 위해 스키마를 체계적으로 분해하는 과정입니다. 제1정규형, 제2정규형, 제3정규형 등으로 단계가 나뉘며, 정규화를 통해 더 효율적이고 안정적인 스키마를 만들 수 있습니다.

  • 스키마 진화 (Schema Evolution): 한번 만들어진 스키마는 영원하지 않습니다. 서비스가 발전하고 요구사항이 바뀌면서 스키마도 변경되어야 합니다. 테이블에 컬럼을 추가하거나(ALTER TABLE ... ADD COLUMN ...), 기존 컬럼의 데이터 타입을 바꾸는 등의 작업이 필요하며, 이 과정에서 기존 데이터의 손실이 없도록 신중하게 접근해야 합니다.

데이터베이스 스키마는 보이지 않는 곳에서 데이터의 질서와 안정성을 지키는 매우 중요한 기반입니다. 잘 설계된 스키마는 효율적인 데이터 관리의 첫걸음이라고 할 수 있습니다.

더 궁금한 점이 있으신가요? 예를 들어, NoSQL 데이터베이스의 스키마는 관계형 데이터베이스와 어떻게 다른지에 대해 더 알아볼까요?

References

데이터 모델링