[태그:] 기본키

  • 데이터베이스의 신뢰를 지키는 5가지 약속, 무결성 완벽 가이드

    데이터베이스의 신뢰를 지키는 5가지 약속, 무결성 완벽 가이드

    데이터베이스는 단순히 데이터를 쌓아두는 창고가 아니라, 정확하고 신뢰할 수 있는 정보를 제공해야 하는 시스템의 심장부입니다. 만약 은행 데이터베이스에 고객의 잔고가 음수로 기록되거나, 쇼핑몰에 존재하지도 않는 상품이 주문되는 일이 벌어진다면 어떻게 될까요? 상상만 해도 끔찍한 데이터의 대혼란이 발생할 것입니다. ‘데이터 무결성(Data Integrity)’은 바로 이러한 데이터의 오류, 불일치, 중복을 막고 데이터베이스에 저장된 데이터가 항상 정확하고 일관된 상태를 유지하도록 보장하는 핵심적인 성질입니다.

    무결성은 데이터베이스 시스템이 스스로 데이터의 정합성을 지키도록 강제하는 규칙들의 집합으로, 데이터베이스 설계의 가장 중요한 목표 중 하나입니다. 이는 마치 사회의 질서를 유지하는 법과 같은 역할을 합니다. 이번 글에서는 데이터베이스의 신뢰도를 결정짓는 가장 중요한 5가지 무결성 제약조건, 즉 개체 무결성, 참조 무결성, 속성(도메인) 무결성, 사용자 정의 무결성, 그리고 이 모든 것의 기반이 되는 키 무결성에 대해 심도 있게 알아보고, 이들이 어떻게 유기적으로 작용하여 데이터의 가치를 지켜내는지 살펴보겠습니다.

    개체 무결성 (Entity Integrity): 모든 데이터는 고유한 신분증을 가져야 한다

    개체 무결성은 테이블 내의 모든 행(Row)이 고유하게 식별 가능해야 한다는 규칙입니다. 이는 마치 세상의 모든 사람이 각자 고유한 주민등록번호를 가지는 것과 같습니다. 만약 주민등록번호가 같은 사람이 둘 있다면, 그 둘을 명확히 구분할 수 없어 큰 혼란이 발생할 것입니다. 데이터베이스의 테이블에서도 마찬가지로, 각 행을 유일하게 식별할 수 있는 장치가 없다면 데이터를 정확하게 관리하고 참조하는 것이 불가능해집니다.

    이러한 개체 무결성을 보장하기 위해 사용하는 핵심 도구가 바로 ‘기본키(Primary Key)’입니다. 기본키는 테이블의 수많은 속성 중에서 각 행을 대표하는 유일한 식별자로 선정된 키입니다.

    기본키의 두 가지 약속

    데이터베이스 시스템은 기본키에 두 가지 엄격한 제약 조건을 강제함으로써 개체 무결성을 실현합니다.

    1. 유일성(Uniqueness): 기본키로 지정된 열의 값은 테이블 내에서 절대 중복되어서는 안 됩니다. 예를 들어, ‘학생’ 테이블에서 ‘학번’을 기본키로 지정했다면, 동일한 학번을 가진 학생이 두 번 이상 등록될 수 없습니다. 시스템이 이를 원천적으로 차단합니다.
    2. NULL 값 불허(Not Null): 기본키 열에는 절대 NULL 값이 들어올 수 없습니다. NULL은 ‘값이 존재하지 않음’ 또는 ‘알 수 없는 값’을 의미하는데, 모든 개체를 식별해야 하는 신분증과 같은 기본키에 값이 없다는 것은 논리적으로 모순이기 때문입니다.

    아래 ‘도서’ 테이블의 예를 살펴보겠습니다.

    도서번호 (PK)도서명저자가격
    BK-101데이터베이스의 이해이지은28000
    BK-102SQL 첫걸음박서준25000
    BK-101네트워크 개론김민수30000
    NULL파이썬 프로그래밍최수빈27000

    ‘도서번호’를 기본키(PK)로 설정하면, 세 번째 행처럼 이미 존재하는 ‘BK-101’을 또다시 입력하려는 시도는 ‘유일성 위배’ 오류를 발생시키며 거부됩니다. 마찬가지로 네 번째 행처럼 도서번호를 비워두고(NULL) 데이터를 입력하려는 시도 역시 ‘NULL 값 불허’ 규칙에 따라 차단됩니다.

    이처럼 개체 무결성은 기본키라는 강력한 제약을 통해 각 데이터 행이 자신만의 명확한 정체성을 갖도록 보장하며, 이는 데이터 관리의 가장 기본적인 출발점이 됩니다.


    참조 무결성 (Referential Integrity): 관계는 허상을 좇지 않는다

    참조 무결성은 두 테이블 사이의 관계가 항상 유효하고 일관된 상태를 유지해야 한다는 규칙입니다. 이는 주로 ‘외래키(Foreign Key)’를 통해 보장되며, 관계형 데이터베이스의 핵심적인 특징을 가장 잘 보여주는 개념입니다. 외래키는 한 테이블의 열이 다른 테이블의 기본키를 참조하여 테이블 간의 연결고리를 만드는 역할을 합니다.

    참조 무결성의 핵심 원칙은 “자식 테이블의 외래키 값은 반드시 부모 테이블의 기본키 값 중 하나이거나, 혹은 NULL 값이어야 한다”는 것입니다. 여기서 부모 테이블은 기본키를 통해 참조되는 쪽이고, 자식 테이블은 외래키를 통해 참조하는 쪽입니다. 이 규칙은 현실 세계의 관계와 매우 유사합니다. 예를 들어, 어떤 학생의 ‘소속 학과’ 정보는 반드시 학교에 실제로 ‘존재하는 학과’ 중 하나여야 합니다. 존재하지도 않는 유령 학과에 소속될 수는 없는 노릇입니다.

    관계의 일관성을 지키는 외래키

    ‘학과’ 테이블과 ‘학생’ 테이블을 예로 들어 참조 무결성을 살펴보겠습니다.

    학과 테이블 (부모 테이블)

    학과코드 (PK)학과명
    CS컴퓨터공학
    MG경영학
    DS디자인

    학생 테이블 (자식 테이블)

    학번 (PK)이름소속학과 (FK)
    1001김민준CS
    1002이서연MG
    1003박도윤EE

    ‘학생’ 테이블의 ‘소속학과’ 열은 ‘학과’ 테이블의 ‘학과코드'(기본키)를 참조하는 외래키(FK)입니다. 이 관계가 설정되면, ‘학생’ 테이블의 ‘소속학과’에는 반드시 ‘학과’ 테이블의 ‘학과코드’에 존재하는 값(CS, MG, DS)만 들어올 수 있습니다. 따라서 세 번째 행처럼 존재하지 않는 ‘EE’라는 학과코드를 입력하려고 하면, 데이터베이스는 ‘참조 무결성 위배’ 오류를 발생시키며 이를 막습니다.

    또한, 참조 무결성은 데이터의 변경 및 삭제 작업에도 영향을 미칩니다.

    • 부모 테이블 데이터 삭제/변경 시: ‘학과’ 테이블에서 ‘CS’ 학과를 삭제하려고 할 때, ‘학생’ 테이블에 ‘CS’를 참조하는 학생(김민준)이 한 명이라도 존재한다면, 기본적으로 삭제가 제한됩니다. 이는 고아가 되는 데이터를 방지하기 위함입니다. 물론, 설정을 통해 부모 데이터가 삭제될 때 자식 데이터도 함께 삭제(ON DELETE CASCADE)되거나, 자식 데이터의 외래키 값을 NULL로 변경(ON DELETE SET NULL)하도록 지정할 수도 있습니다.
    • 자식 테이블 데이터 삽입 시: 위에서 본 것처럼 존재하지 않는 부모 키 값을 참조하는 데이터는 삽입할 수 없습니다.

    이처럼 참조 무결성은 테이블 간의 관계가 항상 논리적으로 타당한 상태를 유지하도록 강제하여, 데이터베이스 전체의 일관성과 안정성을 지키는 파수꾼 역할을 합니다.


    속성(도메인) 무결성 (Attribute/Domain Integrity): 데이터는 제자리를 찾아야 한다

    속성 무결성은 테이블의 특정 열(Attribute)에 입력되는 모든 데이터 값은 미리 정의된 데이터 타입과 형식, 그리고 값의 범위(Domain)를 반드시 따라야 한다는 규칙입니다. 이는 각 데이터가 자신의 성격에 맞는 옷을 입도록 강제하는 것과 같습니다. 예를 들어, ‘나이’ 열에는 숫자만 들어와야 하고, ‘성별’ 열에는 ‘남’ 또는 ‘여’라는 정해진 값만 들어와야 하며, ‘이메일’ 열에는 ‘@’ 기호가 포함된 형식의 문자열이 들어와야 합니다.

    속성 무결성은 데이터가 애초에 잘못된 형태로 입력되는 것을 원천적으로 차단하여 데이터의 품질과 신뢰도를 높이는 가장 기본적인 방어선입니다. 이는 다음과 같은 제약 조건들을 통해 구현됩니다.

    데이터의 형식을 정의하는 규칙들

    1. 데이터 타입(Data Type): 모든 열은 정의될 때 반드시 숫자(INTEGER, NUMBER), 문자열(VARCHAR, CHAR), 날짜(DATE, TIMESTAMP) 등 명확한 데이터 타입을 가져야 합니다. ‘나이’ 열에 ‘스무살’이라는 문자가 입력되는 것을 막아줍니다.
    2. NULL 값 허용 여부(NULL/NOT NULL): 개체 무결성의 기본키처럼, 일반 열에도 NOT NULL 제약 조건을 설정하여 필수 입력 항목에 값이 비는 것을 방지할 수 있습니다. 예를 들어, ‘회원’ 테이블의 ‘이름’ 열은 비워둘 수 없도록 설정할 수 있습니다.
    3. 기본값(DEFAULT): 데이터 입력 시 특정 열에 값이 주어지지 않았을 때 자동으로 입력될 기본값을 미리 지정할 수 있습니다. 예를 들어, ‘가입일’ 열의 기본값을 현재 시간으로 설정하거나, ‘포인트’ 열의 기본값을 0으로 설정할 수 있습니다.
    4. CHECK 제약: 특정 열에 입력될 수 있는 값의 범위나 조건을 직접 명시하는 강력한 규칙입니다.
      • 나이 >= 19 (19세 이상만 허용)
      • 성별 IN ('남', '여') (‘남’ 또는 ‘여’만 허용)
      • 가격 > 0 (가격은 양수여야 함)
      • 이메일 LIKE '%@%.%' (이메일 형식 검사)

    이러한 CHECK 제약은 비즈니스 로직 상 매우 중요한 규칙들을 데이터베이스 레벨에서 강제하여 응용 프로그램의 오류와 관계없이 데이터의 정합성을 보장해 줍니다. 예를 들어, 쇼핑몰의 ‘재고수량’이 음수가 되는 치명적인 오류를 데이터베이스 스스로가 막아줄 수 있습니다.


    사용자 정의 무결성 (User-Defined Integrity): 우리 회사만의 특별한 규칙

    지금까지 살펴본 개체, 참조, 속성 무결성이 대부분의 데이터베이스 환경에 공통적으로 적용되는 일반적인 규칙이라면, 사용자 정의 무결성은 각 시스템의 고유한 비즈니스 규칙과 요구사항을 데이터베이스에 직접 반영하는 것입니다. 이는 법률로 정해진 보편적인 규칙 외에, 특정 조직이나 회사 내부의 고유한 규정을 만드는 것과 같습니다.

    사용자 정의 무결성은 주로 데이터베이스의 ‘트리거(Trigger)’나 ‘스토어드 프로시저(Stored Procedure)’와 같은 기능을 사용하여 구현됩니다.

    비즈니스 로직을 자동화하는 트리거

    트리거는 특정 테이블에 데이터의 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 같은 이벤트가 발생했을 때, 자동으로 실행되도록 미리 정의해 둔 SQL 코드 블록입니다. 이를 통해 복잡한 비즈니스 규칙을 데이터베이스가 스스로 실행하도록 만들 수 있습니다.

    예를 들어, 다음과 같은 사용자 정의 무결성 규칙을 트리거로 구현할 수 있습니다.

    • ‘주문’ 테이블에 새로운 주문이 들어오면(INSERT), 자동으로 ‘재고’ 테이블에서 해당 상품의 수량을 감소시킨다.
    • ‘직원’ 테이블에서 직원의 급여를 수정할 때(UPDATE), 인상률이 20%를 초과하지 못하도록 검사하고, 만약 초과하면 변경을 취소시킨다.
    • ‘게시글’ 테이블의 데이터가 삭제될 때(DELETE), 실제 데이터를 물리적으로 지우는 대신 ‘삭제여부’ 플래그만 ‘Y’로 변경하고, 삭제 로그 테이블에 관련 기록을 남긴다.
    • 은행의 ‘계좌’ 테이블에서 출금 작업이 발생할 때, 출금액이 현재 잔고보다 클 수 없다는 규칙을 적용한다.

    이처럼 사용자 정의 무결성은 데이터베이스가 단순한 데이터 저장소를 넘어, 비즈니스 로직의 일부를 능동적으로 수행하게 함으로써 데이터의 일관성을 더욱 강화하고, 응용 프로그램의 부담을 줄여주는 역할을 합니다.


    키 무결성 (Key Integrity): 모든 무결성의 근간

    키 무결성은 사실 독립적인 무결성이라기보다는, 위에서 설명한 개체 무결성과 참조 무결성을 포괄하고 지원하는 더 근본적인 개념입니다. 키 무결성은 테이블의 모든 키(기본키, 후보키, 외래키 등)가 가져야 할 제약 조건들이 항상 만족되어야 함을 의미합니다.

    • 기본키(Primary Key)와 후보키(Candidate Key)는 반드시 유일한 값을 가져야 하며(유일성), NULL 값을 허용하지 않습니다(개체 무결성). 이를 통해 각 행을 고유하게 식별할 수 있습니다.
    • 대체키(Alternate Key)는 기본키는 아니지만 유일성(UNIQUE 제약)을 가져야 하는 경우가 많습니다. 이는 이메일 주소나 주민등록번호처럼, 비록 기본 식별자는 아니지만 중복되어서는 안 되는 중요한 데이터의 무결성을 보장합니다(속성 무결성의 일부).
    • 외래키(Foreign Key)는 참조하는 테이블의 기본키 값과 일치하거나 NULL이어야 합니다(참조 무결성). 이를 통해 테이블 간의 관계가 깨지지 않도록 보장합니다.

    결국, 데이터베이스의 모든 무결성 규칙은 ‘키’라는 도구를 통해 정의되고 강제된다고 볼 수 있습니다. 적절한 키를 설계하고 제약 조건을 부여하는 것이야말로 데이터 무결성을 확보하는 가장 핵심적인 활동입니다. 키가 제대로 정의되지 않으면 개체 식별이 불가능해지고, 테이블 간의 관계도 신뢰할 수 없게 되며, 결국 데이터베이스 전체가 모래성처럼 무너져 내릴 수 있습니다.


    마무리: 신뢰할 수 있는 데이터 시스템을 위한 약속

    데이터 무결성은 데이터베이스의 생명과도 같습니다. 개체 무결성은 데이터의 정체성을, 참조 무결성은 데이터 간의 관계를, 속성 무결성은 데이터의 형식을, 사용자 정의 무결성은 비즈니스의 논리를, 그리고 키 무결성은 이 모든 것의 기반을 지켜주는 약속입니다. 이 다섯 가지 무결성 제약조건이 서로 얽히고설켜 견고한 그물망을 형성할 때, 비로소 우리의 데이터베이스는 어떠한 오류나 비일관성에도 흔들리지 않는 신뢰의 반석 위에 설 수 있습니다.

    데이터베이스를 설계하고 운영할 때 이러한 무결성 규칙들을 깊이 이해하고 적극적으로 활용하는 것은 선택이 아닌 필수입니다. 이는 단순히 오류를 방지하는 소극적인 차원을 넘어, 데이터의 가치를 극대화하고, 데이터 기반의 의사결정이 항상 정확한 정보 위에서 이루어지도록 보장하는 가장 능동적이고 중요한 활동임을 반드시 기억해야 합니다.

  • 데이터베이스의 질서를 잡는 5개의 열쇠: 슈퍼키부터 외래키까지 완벽 해부

    데이터베이스의 질서를 잡는 5개의 열쇠: 슈퍼키부터 외래키까지 완벽 해부

    데이터베이스의 세계는 수많은 정보가 저장된 거대한 공간과 같습니다. 이 공간에서 우리가 원하는 데이터를 정확하고 빠르게 찾아내고, 데이터 간의 관계를 명확하게 정의하여 정보의 신뢰도를 보장하기 위해 반드시 필요한 것이 바로 ‘키(Key)’입니다. 키는 단순히 데이터를 구분하는 식별자를 넘어, 데이터의 무결성을 지키고, 중복을 방지하며, 관계형 데이터베이스의 핵심적인 구조를 떠받치는 가장 중요한 기둥입니다.

    많은 분들이 기본키(Primary Key)와 외래키(Foreign Key)는 익숙하게 들어보셨겠지만, 이들의 관계와 근간을 이루는 슈퍼키(Super Key), 후보키(Candidate Key), 대체키(Alternate Key)의 개념까지 완벽하게 이해하는 것은 데이터베이스를 깊이 있게 다루기 위한 필수 과정입니다. 이 키들은 각각 독립적인 개념이 아니라, 가장 넓은 범위인 슈퍼키에서부터 시작해 점차 구체화되고 선택되는 유기적인 관계를 맺고 있습니다. 이번 글에서는 이 다섯 가지 키의 개념을 명확히 정의하고, 이들이 어떻게 서로 영향을 주고받으며 데이터베이스의 질서를 만들어가는지 구체적인 예시와 함께 하나하나 파헤쳐 보겠습니다.

    슈퍼키 (Super Key): 유일성을 만족하는 모든 속성의 조합

    데이터베이스 키의 여정은 가장 포괄적인 개념인 슈퍼키에서 시작됩니다. 슈퍼키는 테이블 내의 각 행(Row 또는 튜플)을 유일하게 식별할 수 있는 하나의 속성(Attribute) 또는 속성들의 집합을 의미합니다. 슈퍼키를 이해하는 핵심 단어는 ‘유일성(Uniqueness)’입니다. 즉, 슈퍼키로 지정된 속성(들)의 값은 테이블 내에서 절대 중복되지 않아야 합니다.

    예를 들어, 아래와 같은 ‘학생’ 테이블이 있다고 가정해 봅시다.

    학번주민등록번호이름학년전공이메일
    1001950101-1234567김민준3컴퓨터공학mj.kim@email.com
    1002960315-2345678이서연2경영학sy.lee@email.com
    1003950101-2121212박도윤3컴퓨터공학dy.park@email.com
    1004971120-1456789최지우1디자인jw.choi@email.com

    이 테이블에서 각 학생을 유일하게 구별할 수 있는 속성 또는 속성의 조합은 무엇이 있을까요?

    • {학번}: 학번은 모든 학생에게 고유하게 부여되므로 각 학생을 식별할 수 있습니다. 따라서 {학번}은 슈퍼키입니다.
    • {주민등록번호}: 주민등록번호 역시 대한민국 국민이라면 모두 고유한 값을 가지므로 슈퍼키가 될 수 있습니다.
    • {이메일}: 이메일 주소 또한 일반적으로 개인마다 고유하므로 슈퍼키의 자격이 있습니다.
    • {학번, 이름}: {학번}만으로도 이미 유일성이 보장되지만, 여기에 다른 속성인 {이름}을 추가한 조합 역시 유일성이 깨지지 않습니다. 따라서 {학번, 이름}도 슈퍼키입니다.
    • {주민등록번호, 전공}: {주민등록번호}만으로 유일성이 보장되므로, 여기에 {전공}을 추가해도 여전히 슈퍼키입니다.
    • {이름, 전공}: ‘컴퓨터공학’과에 ‘김민준’이라는 학생이 또 있을 수 있으므로 {이름, 전공} 조합은 슈퍼키가 될 수 없습니다. 동명이인이 존재할 가능성을 배제할 수 없기 때문입니다.

    이처럼 슈퍼키는 유일성을 만족하는 모든 조합을 의미하기 때문에, 그 개수가 매우 많을 수 있습니다. {학번}, {학번, 이름}, {학번, 전공}, {학번, 이름, 전공} … 등 유일성을 보장하는 속성을 하나라도 포함하고 있다면 모두 슈퍼키가 됩니다. 하지만 이 모든 슈퍼키를 식별자로 사용하기에는 불필요한 속성들이 포함되어 있어 비효율적입니다. 그래서 우리는 이 중에서 가장 간결한 조합을 찾아야 할 필요가 생깁니다.


    후보키 (Candidate Key): 최소한의 속성으로 유일성을 만족하는 정예 멤버

    후보키는 슈퍼키 중에서 더 이상 속성을 줄일 수 없는, 즉 ‘최소성(Minimality)’을 만족하는 키를 말합니다. 슈퍼키가 ‘유일성’만을 조건으로 하는 넓은 개념이었다면, 후보키는 ‘유일성’과 ‘최소성’이라는 두 가지 까다로운 조건을 모두 만족해야 하는 정예 멤버인 셈입니다.

    최소성이란, 키를 구성하는 속성 중 어느 하나라도 제거하면 더 이상 유일성을 만족하지 못하는 상태를 의미합니다.

    다시 ‘학생’ 테이블의 예시로 돌아가 보겠습니다. 위에서 찾은 슈퍼키들 중에서 어떤 것이 후보키가 될 수 있을까요?

    • {학번}: 유일성을 만족합니다. 여기서 속성을 더 제거할 수 없으므로(속성이 하나뿐이므로) 최소성도 만족합니다. 따라서 {학번}은 후보키입니다.
    • {주민등록번호}: 유일성을 만족하고, 속성이 하나이므로 최소성도 만족합니다. 따라서 {주민등록번호}도 후보키입니다.
    • {이메일}: 유일성을 만족하고, 속성이 하나이므로 최소성도 만족합니다. 따라서 {이메일}도 후보키입니다.
    • {학번, 이름}: 이 조합은 슈퍼키이지만, 후보키는 될 수 없습니다. {이름} 속성을 제거해도 남은 {학번}만으로 유일성이 충분히 보장되기 때문입니다. 즉, 최소성을 만족하지 못합니다.
    • {주민등록번호, 전공}: 이 조합 역시 {전공} 속성이 없어도 {주민등록번호}만으로 유일하므로 최소성을 위반하여 후보키가 될 수 없습니다.

    만약, 어떤 학교에서 {학년, 반, 번호} 세 가지 속성이 합쳐져야만 학생을 유일하게 식별할 수 있다고 가정해 봅시다. 이 경우 {학년, 반, 번호}는 슈퍼키가 됩니다. 여기서 ‘학년’ 하나만 빼면 같은 반에 같은 번호를 가진 다른 학년 학생이 있을 수 있어 유일성이 깨지고, ‘반’이나 ‘번호’를 빼도 마찬가지입니다. 따라서 이 조합은 최소성을 만족하므로 후보키가 될 수 있습니다.

    결론적으로 ‘학생’ 테이블에서는 {학번}, {주민등록번호}, {이메일} 이렇게 세 개의 후보키를 찾을 수 있습니다. 이들은 모두 테이블의 대표 식별자가 될 자격이 있는 ‘후보’들입니다.


    기본키 (Primary Key): 후보키 중에서 선택된 단 하나의 대표

    기본키는 후보키 중에서 데이터베이스 설계자가 선택한 단 하나의 ‘대표’ 키입니다. 후보키들은 모두 테이블의 각 행을 유일하게 식별할 수 있는 자격이 있지만, 이들 중 가장 대표성이 있고, 데이터 관리에 용이하며, 자주 사용될 것이라 판단되는 키를 기본키로 지정합니다.

    기본키는 다음과 같은 매우 중요한 특징을 가집니다.

    1. 유일성(Uniqueness)과 최소성(Minimality): 후보키에서 선택되었으므로 당연히 두 가지 특성을 모두 만족합니다.
    2. Not Null: 기본키로 지정된 속성은 절대 NULL 값을 가질 수 없습니다. 식별자 정보가 비어있다는 것은 논리적으로 말이 되지 않기 때문입니다.
    3. 불변성(Immutability): 기본키의 값은 자주 변경되지 않아야 합니다. 만약 기본키 값이 계속 변경된다면, 이 키를 참조하는 다른 데이터들과의 관계가 불안정해질 수 있습니다.

    ‘학생’ 테이블의 후보키 {학번}, {주민등록번호}, {이메일} 중에서 무엇을 기본키로 선택하는 것이 가장 합리적일까요?

    • {주민등록번호}: 법적으로 고유하며 절대 중복되지 않는 강력한 후보입니다. 하지만 주민등록번호는 민감한 개인정보이므로 보안에 매우 취약하며, 외부에 노출되어서는 안 됩니다. 또한, 국적이 없는 외국인 학생의 경우 주민등록번호가 없을 수 있습니다. 따라서 기본키로는 부적절할 수 있습니다.
    • {이메일}: 일반적으로는 고유하지만, 사용자가 이메일 주소를 변경할 가능성이 있습니다. 기본키는 불변성을 지향해야 하므로, 변경 가능성이 있는 이메일 주소는 좋은 기본키라고 보기 어렵습니다.
    • {학번}: 각 학생에게 학교가 부여하는 고유한 번호로, NULL 값이 될 수 없으며, 졸업할 때까지 변하지 않는 값입니다. 개인정보 노출 위험도 없으며, 다른 테이블(예: 수강신청 테이블)에서 학생을 참조할 때 사용하기에도 간결하고 명확합니다.

    따라서 대부분의 설계자는 이 경우 {학번}을 기본키로 선택할 것입니다. 이처럼 기본키는 단순히 유일한 값을 넘어, 데이터의 안정성, 간결성, 비즈니스 로직상의 대표성 등을 종합적으로 고려하여 신중하게 선택해야 합니다.


    대체키 (Alternate Key): 기본키가 되지 못한 나머지 후보들

    대체키는 이름 그대로 기본키를 ‘대체’할 수 있는 키입니다. 즉, 후보키 중에서 기본키로 선택되지 않고 남은 키들을 대체키라고 부릅니다. 대체키 역시 후보키이므로 유일성과 최소성을 모두 만족하며, 각 행을 유일하게 식별할 수 있는 능력을 가지고 있습니다.

    ‘학생’ 테이블에서 {학번}을 기본키로 선택했다면, 남은 후보키인 {주민등록번호}{이메일}이 바로 대체키가 됩니다.

    대체키는 왜 필요할까요? 비록 대표 선수인 기본키는 아니지만, 이들 역시 시스템 운영에 있어 중요한 역할을 합니다. 예를 들어, 학생이 자신의 학번을 잊어버렸을 때, 이메일 주소나 주민등록번호를 통해 본인 인증을 하고 학번을 찾을 수 있도록 시스템을 구현할 수 있습니다. 이처럼 대체키는 기본키 외에 데이터를 검색하거나 유일성을 보장해야 하는 추가적인 제약 조건이 필요할 때 유용하게 사용됩니다.

    데이터베이스 시스템에서는 대체키에 대해 ‘UNIQUE’ 제약 조건을 설정하여 데이터의 중복 입력을 방지하는 용도로 많이 활용합니다. 예를 들어, {이메일} 속성에 UNIQUE 제약 조건을 걸어두면, 시스템에 동일한 이메일 주소가 두 번 등록되는 것을 막을 수 있어 데이터의 정합성을 높일 수 있습니다.

    정리하자면, 키들의 관계는 다음과 같습니다.

    1. 유일성을 만족하는 모든 키의 조합을 찾는다. (슈퍼키)
    2. 슈퍼키 중에서 최소성을 만족하는 키들을 추려낸다. (후보키)
    3. 후보키 중에서 가장 대표가 될 만한 키를 하나 선택한다. (기본키)
    4. 기본키가 되고 남은 후보키들을 대체키로 둔다. (대체키)

    외래키 (Foreign Key): 테이블과 테이블을 연결하는 관계의 열쇠

    지금까지 다룬 키들이 하나의 테이블 ‘내에서’의 규칙과 질서를 잡는 역할을 했다면, 외래키는 테이블과 테이블 ‘사이’의 관계를 맺어주는 연결고리 역할을 합니다. 외래키는 한 테이블에 속한 속성(열)이 다른 테이블의 기본키를 참조하는 것을 말합니다. 이 관계를 통해 데이터베이스는 데이터의 ‘참조 무결성(Referential Integrity)’을 보장합니다.

    참조 무결성이란, 외래키의 값은 반드시 참조하는 테이블의 기본키 값 중 하나이거나, 혹은 NULL이어야 한다는 규칙입니다. 이는 존재하지 않는 대상을 참조하는, 즉 허상 데이터를 방지하는 매우 중요한 제약 조건입니다.

    예를 들어, ‘수강신청’이라는 새로운 테이블을 만들어 보겠습니다.

    학생 테이블

    학번 (PK)이름전공
    1001김민준컴퓨터공학
    1002이서연경영학
    1003박도윤컴퓨터공학

    수강신청 테이블

    수강ID (PK)수강생_학번 (FK)과목코드성적
    11001CS101A+
    21002MG203A0
    31001CS305B+
    49999CS101C0

    ‘수강신청’ 테이블의 수강생_학번은 ‘학생’ 테이블의 학번(기본키)을 참조하는 외래키(FK, Foreign Key)입니다. 이 외래키 관계를 설정하면, 수강생_학번 열에는 반드시 ‘학생’ 테이블의 학번 열에 존재하는 값(1001, 1002, 1003)만 입력될 수 있습니다.

    위 예시의 4번째 행처럼, ‘학생’ 테이블에 존재하지 않는 9999 학번 학생의 수강 정보를 입력하려고 하면 데이터베이스 시스템은 참조 무결성 위반 오류를 발생시키며 데이터 입력을 막습니다. 또한, ‘학생’ 테이블에서 학생 1001의 정보를 삭제하려고 할 때, 이 학생의 수강신청 정보가 ‘수강신청’ 테이블에 남아있다면 삭제가 제한될 수 있습니다. 이처럼 외래키는 두 테이블의 데이터가 항상 일관성 있는 상태를 유지하도록 강제하는 안전장치 역할을 합니다.

    이러한 외래키 관계를 통해 우리는 여러 테이블에 흩어져 있는 정보를 마치 하나처럼 연결하여 조회하고 관리할 수 있게 되며, 이것이 바로 관계형 데이터베이스의 핵심 원리입니다.


    마무리: 데이터 무결성의 초석, 올바른 키의 선택과 활용

    지금까지 데이터베이스의 질서를 유지하는 다섯 가지 핵심 키인 슈퍼키, 후보키, 기본키, 대체키, 외래키에 대해 알아보았습니다. 이 키들은 단순히 데이터를 구분하는 표식을 넘어, 데이터의 유일성과 최소성을 보장하고 테이블 간의 논리적 관계를 설정하여 데이터의 무결성과 일관성을 지키는 데이터베이스의 헌법과도 같습니다.

    가장 넓은 범위의 슈퍼키에서 시작하여 최소성을 만족하는 후보키를 걸러내고, 그중 가장 적합한 것을 기본키로 선정하며, 나머지를 대체키로 활용하고, 외래키를 통해 관계를 확장해나가는 이 일련의 과정은 논리적이고 체계적인 데이터베이스 설계의 근간을 이룹니다. 따라서 각 키의 특징과 관계를 명확히 이해하고, 설계하려는 시스템의 특성을 깊이 고려하여 최적의 키를 선택하고 적용하는 것은 성공적인 데이터베이스 구축의 가장 중요한 첫걸음이라 할 수 있습니다. 키를 잘못 선택하면 데이터의 신뢰도가 떨어지고 시스템의 성능 저하를 유발할 수 있으므로 항상 신중을 기해야 합니다.

  • 데이터 세계의 표준어, 관계형 데이터 모델(Relational Data Model)의 모든 것

    데이터 세계의 표준어, 관계형 데이터 모델(Relational Data Model)의 모든 것

    오늘날 우리가 사용하는 대부분의 정보 시스템, 즉 은행, 전자상거래, 예약 시스템 등의 근간에는 보이지 않는 질서와 규칙이 존재합니다. 이 질서를 만드는 핵심 설계 사상이 바로 ‘관계형 데이터 모델(Relational Data Model)’입니다. 1970년 IBM의 연구원이었던 에드거 F. 커드(Edgar F. Codd)에 의해 처음 제안된 이 모델은, 복잡한 현실 세계의 데이터를 단순하고 직관적인 2차원 테이블 형태로 표현하여 데이터의 일관성과 무결성을 보장하는 혁신적인 방법을 제시했습니다. 마치 잘 정리된 엑셀 스프레드시트처럼 데이터를 체계적으로 관리할 수 있게 한 것입니다.

    관계형 데이터 모델은 지난 50여 년간 데이터베이스 기술의 절대적인 표준으로 자리 잡았으며, Oracle, MySQL, PostgreSQL, SQL Server 등 우리가 아는 대부분의 데이터베이스 관리 시스템(DBMS)이 이 모델에 기반하고 있습니다. NoSQL과 같은 새로운 모델이 등장한 지금도, 관계형 모델이 제공하는 데이터의 정합성과 안정성은 여전히 비즈니스의 핵심 영역에서 대체 불가능한 가치를 지니고 있습니다. 이 글에서는 정보처리기사 시험의 단골 주제이자 모든 IT 전문가의 기본 소양인 관계형 데이터 모델의 핵심 구성 요소와 그 작동 원리를 깊이 있게 탐구해 보겠습니다.

    관계형 데이터 모델의 핵심 구성 요소

    관계형 데이터 모델은 현실 세계의 데이터를 몇 가지 핵심적인 구성 요소를 사용해 논리적으로 표현합니다. 이 용어들은 수학의 집합 이론에 뿌리를 두고 있지만, 실제로는 매우 직관적인 개념입니다.

    1. 릴레이션 (Relation): 데이터가 저장되는 테이블

    관계형 모델에서 가장 핵심적인 개념은 ‘릴레이션’으로, 이는 우리가 흔히 부르는 ‘테이블(Table)’에 해당합니다. 릴레이션은 데이터를 행(Row)과 열(Column)으로 구성된 2차원 표 형태로 저장하는 구조입니다. 예를 들어 ‘학생’에 대한 데이터를 관리한다면, ‘학생’ 릴레이션(테이블)을 만들어 관련 정보를 저장합니다.

    • 릴레이션 스키마 (Relation Schema): 릴레이션의 구조를 정의한 것입니다. 즉, 테이블의 이름과 각 열(속성)의 이름 및 데이터 타입을 정의한 ‘틀’에 해당합니다. (예: 학생(학번:정수, 이름:문자열, 학과:문자열))
    • 릴레이션 인스턴스 (Relation Instance): 스키마라는 틀에 실제로 저장된 데이터의 집합, 즉 테이블의 특정 시점의 내용(행들의 집합)을 의미합니다.

    2. 튜플 (Tuple): 의미 있는 데이터의 단위, 행

    ‘튜플’은 릴레이션의 각 행(Row)을 의미하며, 레코드(Record)라고도 부릅니다. 하나의 튜플은 연관된 데이터 값들의 의미 있는 집합입니다. 예를 들어 ‘학생’ 릴레이션에서 하나의 튜플은 한 명의 학생에 대한 ‘학번’, ‘이름’, ‘학과’ 등의 완전한 정보를 담고 있습니다. 릴레이션은 이러한 튜플들의 집합으로 구성됩니다.

    3. 속성 (Attribute): 데이터의 구체적인 항목, 열

    ‘속성’은 릴레이션의 각 열(Column)을 의미하며, 필드(Field)라고도 부릅니다. 속성은 데이터의 가장 작은 논리적 단위로, 개체(Entity)가 가질 수 있는 구체적인 특성을 나타냅니다. ‘학생’ 릴레이션이라면 ‘학번’, ‘이름’, ‘학과’, ‘학년’ 등이 각각의 속성이 됩니다.

    • 속성의 특징:
      • 하나의 릴레이션 내에서 속성의 이름은 유일해야 합니다.
      • 각 속성의 값은 원자값(Atomic Value)이어야 합니다. 즉, 더 이상 분해할 수 없는 단일 값을 가져야 합니다. (예: ‘취미’ 속성에 ‘독서, 영화감상’처럼 여러 값을 넣을 수 없습니다.)

    4. 도메인 (Domain): 속성이 가질 수 있는 값의 범위

    ‘도메인’은 하나의 속성이 가질 수 있는 모든 허용된 값들의 집합을 의미합니다. 이는 해당 속성의 데이터 타입(예: 정수, 문자열, 날짜)과 제약 조건(예: ‘성별’ 속성은 ‘남’ 또는 ‘여’만 가능)을 함께 정의하는 개념입니다. 예를 들어, ‘학년’ 속성의 도메인은 {1, 2, 3, 4}라는 정수 집합이 될 수 있습니다. 도메인을 통해 데이터의 입력 오류를 막고 데이터의 유효성을 보장할 수 있습니다.

    관계형 모델 용어일반적인 데이터베이스 용어설명
    릴레이션 (Relation)테이블 (Table)데이터 저장의 기본 구조 (2차원 표)
    튜플 (Tuple)행 (Row), 레코드 (Record)데이터의 개별 단위 (한 학생의 정보)
    속성 (Attribute)열 (Column), 필드 (Field)데이터의 구체적인 항목 (이름, 학과)
    도메인 (Domain)속성이 가질 수 있는 값의 범위 (데이터 타입, 제약)

    관계와 무결성: 관계형 모델의 심장

    관계형 데이터 모델의 ‘관계형’이라는 이름은 단순히 테이블을 사용하는 것만을 의미하지 않습니다. 그 핵심은 여러 릴레이션(테이블) 간에 ‘관계’를 맺고, 데이터의 ‘무결성’을 지키는 것에 있습니다. 이를 위해 ‘키(Key)’와 ‘무결성 제약조건’이라는 중요한 개념이 사용됩니다.

    키(Key)를 이용한 관계 설정

    흩어져 있는 데이터들을 의미 있게 연결하는 다리 역할을 하는 것이 바로 키(Key) 입니다.

    • 기본키 (Primary Key): 하나의 릴레이션 내에서 각 튜플(행)을 유일하게 식별할 수 있는 속성 또는 속성들의 집합입니다. 기본키는 NULL 값을 가질 수 없으며, 중복된 값을 가져서도 안 됩니다. (예: 학생 릴레이션의 ‘학번’)
    • 외래키 (Foreign Key): 한 릴레이션에 속한 속성(또는 속성 집합)이 다른 릴레이션의 기본키를 참조하는 것을 말합니다. 외래키는 바로 이 릴레이션 간의 관계를 표현하는 핵심적인 도구입니다.

    예를 들어, ‘학생’ 릴레이션과 ‘수강’ 릴레이션이 있다고 가정해 봅시다.

    • 학생: {학번(PK), 이름, 학과}
    • 수강: {수강번호(PK), 학번(FK), 과목코드, 성적}

    ‘수강’ 릴레이션의 학번(FK)은 ‘학생’ 릴레이션의 학번(PK)을 참조합니다. 이를 통해 우리는 어떤 학생이 어떤 과목을 수강했는지 명확하게 연결하여 파악할 수 있습니다.

    무결성 제약조건 (Integrity Constraints)

    무결성은 데이터베이스에 저장된 데이터가 항상 정확하고 일관된 상태를 유지하도록 보장하는 성질입니다. 관계형 모델은 이를 위해 다음과 같은 제약조건을 강제합니다.

    1. 개체 무결성 (Entity Integrity): 기본키는 NULL 값을 가질 수 없다는 규칙입니다. 모든 튜플은 유일하게 식별 가능한 기본키 값을 반드시 가져야만 그 존재의 의미가 있기 때문입니다.
    2. 참조 무결성 (Referential Integrity): 외래키의 값은 반드시 참조하는 릴레이션의 기본키 값으로 존재하거나, 혹은 NULL 값이어야 한다는 규칙입니다. 위 예시에서 ‘학생’ 테이블에 존재하지 않는 ‘9999’ 학번으로 ‘수강’ 테이블에 데이터를 삽입할 수 없도록 막는 것이 바로 참조 무결성입니다. 이를 통해 존재하지 않는 대상을 참조하는 ‘유령 데이터’가 발생하는 것을 원천적으로 차단합니다.
    3. 도메인 무결성 (Domain Integrity): 모든 속성 값은 정의된 도메인에 속한 값이어야 한다는 규칙입니다. ‘성별’ 속성에 ‘중성’이라는 값을 입력할 수 없도록 막는 것이 여기에 해당합니다.

    관계형 데이터 모델의 장점과 현재

    관계형 데이터 모델이 오랜 시간 동안 데이터베이스 시장을 지배할 수 있었던 이유는 명확합니다.

    • 단순하고 직관적인 구조: 복잡한 데이터를 2차원 테이블 형태로 단순화하여 사용자가 이해하고 사용하기 쉽습니다.
    • 데이터 일관성 및 무결성 보장: 키와 제약조건을 통해 데이터의 중복을 최소화하고, 항상 정확하고 일관된 데이터를 유지합니다. 이는 금융 거래와 같이 데이터의 신뢰성이 절대적으로 중요한 시스템에 필수적입니다.
    • 데이터 독립성: 데이터의 논리적 구조(스키마)와 물리적 저장 구조를 분리하여, 저장 방식이 변경되어도 응용 프로그램에 영향을 주지 않습니다.
    • 표준화된 질의어 (SQL): SQL(Structured Query Language)이라는 강력하고 표준화된 언어를 통해 누구나 쉽게 데이터를 조작하고 조회할 수 있습니다.

    물론 빅데이터 시대가 도래하면서 비정형 데이터 처리나 수평적 확장에 대한 유연성이 부족하다는 단점이 부각되어 NoSQL 모델이 주목받기도 했습니다. 하지만 여전히 전 세계 대부분의 기업과 기관에서는 데이터의 정합성과 트랜잭션 처리가 중요한 핵심 시스템에 관계형 데이터베이스(RDBMS)를 사용하고 있으며, 클라우드 환경에 맞춰 진화한 NewSQL 데이터베이스들도 관계형 모델의 장점을 계승하고 있습니다.

    결론: 데이터 관리의 변치 않는 패러다임

    관계형 데이터 모델은 단순히 데이터를 표 형태로 저장하는 방법을 넘어, 데이터 간의 관계를 정의하고 무결성을 강제함으로써 데이터베이스를 하나의 신뢰할 수 있는 정보 시스템으로 만들어주는 강력한 패러다임입니다. 이 모델 덕분에 우리는 데이터의 중복과 불일치 문제에서 벗어나 데이터 자체의 의미에 집중할 수 있게 되었습니다.

    SQL을 배우고 데이터베이스를 다룬다는 것은 곧 관계형 데이터 모델의 철학 위에서 데이터를 논리적으로 조작하는 방법을 배우는 것과 같습니다. 비록 새로운 데이터 모델들이 계속해서 등장하고 있지만, 관계형 모델이 제시한 데이터 관리의 기본 원칙과 구조는 앞으로도 오랫동안 데이터 기술의 근간을 이루는 변치 않는 표준으로 남을 것입니다.

  • 데이터의 주민등록번호, 키(Key)로 관계와 무결성을 보장하다

    데이터의 주민등록번호, 키(Key)로 관계와 무결성을 보장하다

    수많은 사람 속에서 ‘나’를 유일하게 증명하는 주민등록번호처럼, 방대한 데이터의 바다에서 특정 데이터를 정확하게 찾아내고 구분하기 위해서는 고유한 식별자가 반드시 필요합니다. 데이터베이스 세계에서 이 주민등록번호와 같은 역할을 하는 것이 바로 ‘키(Key)’입니다. 키는 단순히 테이블의 특정 행(Row)을 식별하는 역할을 넘어, 테이블 간의 관계를 맺어주고 데이터의 일관성과 무결성을 지키는 핵심적인 장치입니다.

    만약 키가 없다면, 우리는 ‘컴퓨터공학과에 재학 중인 김정보’라는 학생의 성적을 찾기 위해 테이블의 모든 데이터를 일일이 뒤져야 할지도 모릅니다. 동명이인이라도 있다면 문제는 더욱 심각해집니다. 키는 이러한 혼란과 비효율을 막고, 데이터베이스가 질서정연하고 신뢰할 수 있는 시스템으로 작동하게 하는 근본 원리입니다. 이 글에서는 정보처리기사 시험의 필수 개념이자, 데이터베이스 설계의 심장이라 할 수 있는 다양한 종류의 키에 대해 그 개념과 관계, 그리고 중요성을 심도 있게 알아보겠습니다.

    키의 종류: 목적에 따라 역할을 나누다

    데이터베이스에서는 여러 종류의 키가 각기 다른 목적과 규칙을 가지고 사용됩니다. 이들의 관계를 이해하는 것이 데이터베이스 설계를 위한 첫걸음입니다.

    슈퍼키 (Super Key)

    슈퍼키는 테이블의 각 행을 유일하게 식별할 수 있는 속성(Attribute) 또는 속성들의 집합입니다. 유일성(Uniqueness)은 만족하지만, 최소성(Minimality)은 만족하지 않을 수 있습니다. 즉, 행을 식별하는 데 필요 없는 속성이 포함될 수 있다는 의미입니다.

    예를 들어, ‘학생’ 테이블이 {학번, 주민등록번호, 이름, 학과} 속성으로 구성되어 있다고 가정해 보겠습니다.

    • {학번} -> 각 학생을 유일하게 식별 가능하므로 슈퍼키입니다.
    • {주민등록번호} -> 역시 유일하게 식별 가능하므로 슈퍼키입니다.
    • {학번, 이름} -> ‘학번’만으로도 충분히 식별 가능하지만, 이 조합 역시 모든 학생을 유일하게 식별할 수 있으므로 슈퍼키입니다.
    • {학번, 주민등록번호, 이름} -> 이 조합 또한 유일성을 만족하므로 슈퍼키입니다.

    이처럼 슈퍼키는 유일하게 식별 가능한 모든 속성의 조합을 의미하는 광범위한 개념입니다.

    후보키 (Candidate Key)

    후보키는 슈퍼키 중에서 최소성까지 만족하는 키입니다. 즉, 각 행을 유일하게 식별할 수 있으면서, 꼭 필요한 최소한의 속성만으로 구성된 키를 말합니다. 후보키에서 속성을 하나라도 제거하면 더 이상 유일성을 만족하지 못하게 됩니다.

    위의 ‘학생’ 테이블 예시에서 후보키는 다음과 같습니다.

    • {학번}: 유일성과 최소성을 모두 만족합니다.
    • {주민등록번호}: 유일성과 최소성을 모두 만족합니다.
    • {학번, 이름}: 최소성을 만족하지 않습니다. ‘이름’ 속성을 제거해도 {학번}만으로 유일한 식별이 가능하기 때문입니다. 따라서 후보키가 아닙니다.

    후보키는 ‘기본키가 될 수 있는 후보’들이며, 모든 테이블은 하나 이상의 후보키를 반드시 가집니다.

    기본키 (Primary Key, PK)

    기본키는 후보키 중에서 설계자가 특별히 선택한 단 하나의 키입니다. 테이블의 모든 행은 기본키 값을 통해 유일하게 식별되고 접근됩니다. 기본키는 다음과 같은 중요한 제약 조건을 반드시 따라야 합니다.

    1. 유일성 (Uniqueness): 모든 행의 기본키 값은 유일해야 하며, 중복된 값을 가질 수 없습니다.
    2. 최소성 (Minimality): 행을 식별하는 데 필요한 최소한의 속성으로 구성되어야 합니다.
    3. 개체 무결성 (Entity Integrity): NULL 값을 가질 수 없습니다. 즉, 기본키 값은 반드시 존재해야 합니다.

    설계자는 여러 후보키 중에서 가장 데이터를 잘 대표하고, 값이 변하지 않으며, 단순한 형태의 키를 기본키로 선정하는 것이 일반적입니다. ‘학생’ 테이블에서는 보통 {학번}을 기본키로 선택합니다.

    대체키 (Alternate Key)

    대체키는 후보키 중에서 기본키로 선택되지 않고 남은 키들을 말합니다. ‘학생’ 테이블에서 {학번}을 기본키로 선택했다면, 또 다른 후보키였던 {주민등록번호}는 대체키가 됩니다. 대체키 역시 후보키의 특성을 그대로 가지고 있으므로, 유일성과 최소성을 만족하며 NULL 값을 허용하지 않는 것이 좋습니다.

    외래키 (Foreign Key, FK)

    외래키는 한 테이블의 속성(또는 속성들의 집합)이 다른 테이블의 기본키를 참조하는 키입니다. 이는 테이블 간의 관계를 맺어주는 매우 중요한 역할을 하며, 데이터베이스의 ‘관계형’이라는 이름이 붙은 이유이기도 합니다. 외래키는 두 테이블을 연결하는 다리 역할을 하며, 데이터의 일관성을 보장하는 ‘참조 무결성’ 제약 조건을 설정하는 데 사용됩니다.

    예를 들어, ‘수강신청’ 테이블이 있고, 이 테이블에는 어떤 학생이 어떤 과목을 신청했는지에 대한 정보가 들어있다고 가정해 봅시다.

    • 학생 테이블: {학번(PK), 이름, 학과}
    • 과목 테이블: {과목코드(PK), 과목명, 학점}
    • 수강신청 테이블: {신청번호(PK), 학번(FK), 과목코드(FK), 신청일}

    여기서 ‘수강신청’ 테이블의 학번은 ‘학생’ 테이블의 학번(PK)을 참조하는 외래키이고, 과목코드는 ‘과목’ 테이블의 과목코드(PK)를 참조하는 외래키입니다.

    키 종류유일성최소성NULL 값역할 및 특징
    슈퍼키OXO유일성을 만족하는 모든 속성의 조합
    후보키OOX유일성과 최소성을 만족 (기본키 후보)
    기본키OOX후보키 중 선택된 단 하나의 대표 키
    대체키OOX후보키 중 기본키가 되고 남은 키
    외래키XXO다른 테이블의 기본키를 참조, 관계 설정

    관계의 핵심, 기본키와 외래키의 상호작용

    데이터베이스의 힘은 데이터를 단순히 저장하는 것을 넘어, 데이터 간의 관계를 정의하고 유지하는 데 있습니다. 이 관계의 중심에 바로 기본키(PK)와 외래키(FK)가 있습니다. 이 둘의 조합은 ‘참조 무결성(Referential Integrity)’이라는 중요한 규칙을 강제합니다.

    참조 무결성 (Referential Integrity)

    참조 무결성이란 외래키의 값은 반드시 참조하는 테이블의 기본키 값으로 존재하거나, 혹은 NULL 값이어야 한다는 규칙입니다. 이 규칙은 존재하지 않는 데이터를 참조하는 것을 막아 데이터의 일관성과 신뢰도를 극적으로 높여줍니다.

    앞서 들었던 ‘학생’과 ‘수강신청’ 테이블의 예를 다시 보겠습니다.

    • ‘수강신청’ 테이블에 데이터를 삽입할 때, 학번 컬럼에는 ‘학생’ 테이블에 실제로 존재하는 학번 값만 입력할 수 있습니다. 존재하지 않는 ‘9999’라는 학번으로 수강 신청 데이터를 만들려고 하면 데이터베이스 시스템이 오류를 발생시키며 입력을 거부합니다. 이것이 바로 삽입 시의 참조 무결성입니다.
    • 만약 ‘학생’ 테이블에서 학번 ‘1001’인 학생을 삭제하려고 할 때, ‘수강신청’ 테이블에 ‘1001’ 학생의 수강 기록이 남아있다면 어떻게 될까요? 참조 무결성 제약 조건은 이러한 삭제를 막거나, 관련된 수강신청 기록을 함께 삭제(CASCADE)하거나, 학번 값을 NULL로 설정(SET NULL)하도록 하는 등의 옵션을 제공합니다. 이를 통해 부모 없는 자식 데이터(Orphaned Record), 즉 유효하지 않은 참조 관계가 발생하는 것을 방지합니다.

    이처럼 PK와 FK는 서로 긴밀하게 상호작용하며, 사용자의 실수나 논리적 오류로부터 데이터베이스를 보호하는 강력한 수호자 역할을 합니다.

    복합키 (Composite Key)

    때로는 하나의 속성만으로는 행을 유일하게 식별할 수 없어 두 개 이상의 속성을 조합해야만 기본키 역할을 할 수 있는 경우가 있습니다. 이렇게 두 개 이상의 속성을 묶어 만든 기본키를 복합키라고 합니다.

    예를 들어, M:N 관계를 해소하기 위해 만들어지는 연결 테이블에서 복합키가 자주 사용됩니다. ‘수강신청’ 테이블에서 신청번호 없이 {학번, 과목코드}를 조합하여 기본키로 사용할 수 있습니다. ‘한 학생은 한 과목을 한 번만 신청할 수 있다’는 규칙이 있다면, 이 두 속성의 조합은 항상 유일성을 만족하기 때문입니다. 이 경우, {학번, 과목코드} 자체가 이 테이블의 복합 기본키가 됩니다.


    결론: 데이터 무결성의 초석이자 관계의 시작

    지금까지 데이터베이스의 다양한 키의 종류와 그 역할을 살펴보았습니다. 키는 데이터베이스 설계의 가장 기초적이면서도 가장 중요한 개념입니다. 어떤 속성을 키로 선택하고, 테이블 간에 어떤 관계를 맺어줄 것인지를 결정하는 과정이 바로 데이터 모델링의 핵심입니다.

    • 슈퍼키후보키를 통해 테이블 내에서 데이터를 유일하게 식별할 수 있는 모든 가능성을 찾아냅니다.
    • 그중 가장 적합한 기본키를 선택하여 개체 무결성을 보장하고, 데이터 접근의 기준점을 마련합니다.
    • 외래키를 사용하여 테이블 간의 논리적 관계를 설정하고, 참조 무결성을 통해 데이터의 일관성을 유지합니다.

    효율적이고 안정적인 데이터베이스를 구축하기 위해서는 각 키의 특성을 명확히 이해하고, 설계하려는 시스템의 요구사항에 맞게 적절한 키를 신중하게 선택하고 배치하는 능력이 필수적입니다. 키는 단순히 데이터를 구분하는 식별자를 넘어, 데이터 세상의 질서와 신뢰를 지탱하는 보이지 않는 뼈대와 같습니다. 이 뼈대를 얼마나 튼튼하고 논리적으로 설계하는가에 따라 데이터베이스 시스템 전체의 품질이 좌우된다는 점을 반드시 기억해야 합니다.