2025-08-16 12:51

Tags:

데이터 세계의 헌법 관계형 모델 제약조건 완벽 해설

잘 정리된 도서관을 상상해 보세요. 모든 책은 고유한 청구기호를 가지고 있고(중복 불가), 특정 주제에 따라 분류되어 있으며, 대출 기록에는 반드시 등록된 회원 정보만 기입됩니다. 만약 이런 규칙이 없다면 도서관은 책 더미에 불과할 것입니다. 원하는 책을 찾는 것은 불가능에 가깝고, 대출 기록은 신뢰할 수 없게 되겠죠.

**관계형 모델(Relational Model)**은 바로 이 데이터베이스라는 거대한 도서관에 질서를 부여하기 위해 탄생한 설계 사상입니다. 그리고 **관계형 모델 제약조건(Relational Model Constraints)**은 이 질서를 유지하는 가장 근본적인 원칙, 즉 ‘헌법’과 같습니다. 이 헌법은 데이터가 어떤 상황에서도 그 의미를 잃지 않고, 항상 정확하며 일관된 상태를 유지하도록 보장하는 **데이터 무결성(Data Integrity)**을 지키는 것을 최고 목표로 삼습니다.

이 핸드북에서는 데이터 무결성을 지키는 네 가지 핵심 원칙(제약조건)을 통해, 견고하고 신뢰성 있는 데이터베이스가 어떻게 만들어지는지 그 원리를 파헤쳐 봅니다.

1. 관계형 모델 제약조건이란 무엇인가?

관계형 모델 제약조건은 특정 SQL 구현(MySQL, Oracle 등)에 종속된 규칙이 아니라, 모든 관계형 데이터베이스가 따라야 하는 이론적이고 개념적인 규칙의 집합입니다. 이 규칙들은 데이터가 관계(테이블) 안에 어떻게 저장되고, 관계들 사이에서 어떻게 연결되어야 하는지에 대한 근본적인 약속입니다.

이 헌법은 크게 네 가지 핵심 조항으로 이루어져 있습니다.

  1. 도메인 제약 (Domain Constraint)

  2. 키 제약 (Key Constraint)

  3. 개체 무결성 제약 (Entity Integrity Constraint)

  4. 참조 무결성 제약 (Referential Integrity Constraint)

이제 이 네 가지 헌법 조항이 데이터 세계의 질서를 어떻게 수호하는지 하나씩 살펴보겠습니다.

2. 데이터 무결성의 4대 원칙

🔹 제1원칙: 도메인 제약 (Domain Constraint) - “정해진 종류의 값만 허용한다”

도메인 제약은 가장 기본적이고 직관적인 규칙입니다. 이는 테이블의 각 속성(Attribute, 열)이 가질 수 있는 값의 **‘허용된 범위’**를 지정하는 것을 의미합니다.

  • 만들어진 이유: ‘나이’ 열에 ‘스무살’이라는 문자열이 들어가거나, ‘성별’ 열에 ‘미확인’이라는 정해지지 않은 값이 들어가는 것을 막기 위함입니다. 즉, 각 데이터가 의미적으로 올바른 형태와 범위를 갖도록 보장하는 것이 목적입니다.

  • 비유: 자판기의 동전 투입구를 생각해 보세요. 동전 투입구는 정해진 크기와 모양의 동전만 받아들입니다. 지폐나 다른 이물질을 넣으면 받아들이지 않죠. 이처럼 도메인 제약은 각 열이 자신의 역할에 맞는 ‘올바른 형태의 데이터’만 받도록 하는 필터 역할을 합니다.

  • 구조 및 사용법:

    • 데이터 타입: INTEGER, VARCHAR(100), DATE 등 속성의 데이터 타입을 지정하는 것 자체가 가장 기본적인 도메인 제약입니다.

    • CHECK 제약: age > 0 처럼 값의 범위를 명시적으로 제한합니다.

    • NOT NULL: 해당 속성에 NULL 값이 허용되지 않도록 강제합니다.

    • ENUM 타입: gender IN ('남', '여') 와 같이 허용되는 값의 목록을 직접 정의합니다.

    CREATE TABLE Products (
        product_id INT,
        product_name VARCHAR(255), -- 도메인: 최대 255자의 문자열
        stock_quantity INT CHECK (stock_quantity >= 0), -- 도메인: 0 이상의 정수
        status VARCHAR(10) DEFAULT '판매중' -- 도메인: '판매중', '품절' 등 + 기본값
    );
    

🔹 제2원칙: 키 제약 (Key Constraint) - “모든 행은 고유하게 식별되어야 한다”

키 제약은 한 테이블 내의 모든 행(Tuple, 레코드)들이 서로 중복되지 않고 유일하게 구분될 수 있어야 한다는 원칙입니다.

  • 만들어진 이유: 수만 명의 ‘김민준’이라는 동명이인 중에서 특정 한 명을 정확히 찾아내기 위함입니다. 만약 모든 행을 구분할 방법이 없다면, 데이터를 수정하거나 삭제할 때 엉뚱한 데이터가 변경되는 심각한 문제가 발생할 수 있습니다.

  • 비유: 모든 국민이 고유한 주민등록번호를 부여받는 것과 같습니다. 이름, 생년월일, 주소가 모두 같더라도 주민등록번호를 통해 정확히 특정 개인을 식별할 수 있습니다.

  • 구조 및 핵심 개념:

    • 슈퍼키 (Superkey): 행을 고유하게 식별할 수 있는 하나 이상의 속성(열)들의 집합입니다. 예를 들어, {주민등록번호}, {주민등록번호, 이름}, {운전면허번호, 이름} 등은 모두 슈퍼키가 될 수 있습니다.

    • 후보키 (Candidate Key): 슈퍼키 중에서 더 이상 쪼갤 수 없는 ‘최소한의’ 슈퍼키를 의미합니다. {주민등록번호, 이름}에서 ‘이름’을 빼도 {주민등록번호}만으로 충분히 식별 가능하므로, {주민등록번호, 이름}은 후보키가 아닙니다. 하지만 {주민등록번호}는 후보키입니다.

    • 기본키 (Primary Key): 여러 후보키 중에서 데이터베이스 설계자가 대표로 선정한 단 하나의 키입니다. 테이블의 ‘신분증’과 같은 역할을 하며, 가장 핵심적인 식별자가 됩니다.

    • 대체키 (Alternate Key): 후보키 중에서 기본키로 선택되지 않은 나머지 키들입니다.

🔹 제3원칙: 개체 무결성 제약 (Entity Integrity Constraint) - “식별자는 절대 비어있을 수 없다”

개체 무결성 제약은 제2원칙인 키 제약과 직접적으로 연결되는 매우 단순하고 강력한 규칙입니다. **“기본키(Primary Key)를 구성하는 어떤 속성도 NULL 값을 가질 수 없다”**는 원칙입니다.

  • 만들어진 이유: 테이블의 각 행을 식별하는 유일한 값인 기본키가 존재하지 않는다면(NULL이라면), 해당 행은 식별 자체가 불가능한 ‘유령 데이터’가 되어버립니다. 이는 키 제약의 근본 목적을 위배하는 것입니다.

  • 비유: 주민등록번호가 없는 국민은 있을 수 없습니다. 모든 국민은 국가 시스템에 등록되기 위해 반드시 고유한 주민등록번호를 부여받아야 합니다.

  • 구조 및 사용법:

    • 이 제약은 SQL에서 열을 PRIMARY KEY로 지정하는 순간 자동으로 강제됩니다.

    • PRIMARY KEYUNIQUENOT NULL 제약이 합쳐진 개념으로 이해할 수 있습니다.

    CREATE TABLE Employees (
        -- emp_id는 기본키이므로 절대 NULL 값을 가질 수 없음 (개체 무결성)
        emp_id VARCHAR(10) PRIMARY KEY,
        emp_name VARCHAR(50) NOT NULL,
        department_id INT
    );
    

🔹 제4원칙: 참조 무결성 제약 (Referential Integrity Constraint) - “없는 것을 참조할 수 없다”

참조 무결성 제약은 두 테이블 간의 관계가 항상 유효하고 일관되게 유지되어야 한다는 원칙입니다. **외래키(Foreign Key)**를 통해 이 규칙이 적용됩니다.

  • 만들어진 이유: 존재하지 않는 부서 코드(‘D999’)를 가진 직원을 등록하거나, 이미 주문 기록이 있는 고객 정보를 마음대로 삭제하여 어떤 고객이 주문했는지 알 수 없게 되는 상황을 막기 위함입니다.

  • 비유: 도서관의 대출 기록에 있는 회원 ID는 반드시 실제 도서관 회원 명부에 존재하는 ID여야 합니다. 유령 회원이 책을 빌려갈 수는 없습니다.

  • 구조 및 규칙:

    • 참조하는 테이블 (Referencing Table): 외래키를 가진 테이블 (예: Employees 테이블)

    • 참조되는 테이블 (Referenced Table): 기본키를 가진 테이블 (예: Departments 테이블)

    • 규칙: 외래키(Employees.department_id)의 값은 반드시 참조되는 테이블의 기본키(Departments.department_id)에 존재하는 값이거나, 혹은 NULL이어야 한다.

    -- 참조되는 테이블 (부모)
    CREATE TABLE Departments (
        department_id INT PRIMARY KEY, -- 개체 무결성
        department_name VARCHAR(100) NOT NULL -- 도메인 제약
    );
    
    -- 참조하는 테이블 (자식)
    CREATE TABLE Employees (
        emp_id VARCHAR(10) PRIMARY KEY, -- 개체 무결성
        emp_name VARCHAR(50) NOT NULL, -- 도메인 제약
        department_id INT,
        -- 참조 무결성 제약: department_id는 Departments 테이블의 department_id에
        -- 존재하는 값이거나 NULL이어야 함.
        FOREIGN KEY (department_id) REFERENCES Departments(department_id)
    );
    

3. 결론: 제약조건은 데이터의 신뢰를 지키는 약속

관계형 모델의 네 가지 제약조건(도메인, 키, 개체 무결성, 참조 무결성)은 복잡하고 까다로운 규칙처럼 보일 수 있습니다. 하지만 이들은 데이터베이스라는 거대한 시스템이 혼돈에 빠지지 않고, 언제나 정확하고(Accuracy), 일관되며(Consistency), 신뢰할 수 있는(Reliability) 정보를 제공하도록 지켜주는 최소한의 안전장치이자 근본적인 약속입니다.

이러한 이론적 토대를 명확히 이해할 때, 우리는 비로소 특정 SQL 문법을 넘어 더 견고하고 논리적인 데이터베이스를 설계하고 구축할 수 있는 힘을 갖게 됩니다. 이 헌법의 원칙들을 항상 기억하며 데이터의 세계를 구축해 나가시길 바랍니다.

레퍼런스(References)

제약 조건