기출 foreign key

agnusdei·2025년 5월 7일
0

Database

목록 보기
21/30

외래키 (Foreign Key)란?

**외래키(Foreign Key)**는 한 테이블에서 다른 테이블의 기본키(Primary Key)를 참조하는 컬럼입니다. 외래키는 데이터베이스에서 테이블 간의 관계를 설정하는 중요한 요소로, 데이터의 무결성을 유지하는 데 사용됩니다.

외래키의 주요 목적은 관계형 데이터베이스에서 데이터의 일관성무결성을 보장하는 것입니다. 외래키 제약을 통해 참조된 테이블에서 데이터가 삭제되거나 변경되었을 때, 이를 참조하는 테이블에서도 데이터에 대한 적절한 처리를 할 수 있도록 합니다.

외래키의 원리

  • 참조 무결성: 외래키를 사용하면 자식 테이블에 존재하는 값이 부모 테이블의 값과 일치하는지 확인합니다. 예를 들어, 자식 테이블에서 외래키 값이 부모 테이블의 기본키 값 중 하나여야 합니다.
  • 제약조건: 외래키는 여러 제약 조건을 가지고 있습니다. 예를 들어, 부모 테이블에서 값이 삭제되거나 수정될 때 자식 테이블의 데이터가 어떻게 처리될지 정의할 수 있습니다.

외래키의 종류

외래키 제약에는 ON DELETEON UPDATE 옵션이 있습니다:

  1. ON DELETE:

    • CASCADE: 부모 테이블에서 레코드가 삭제되면, 자식 테이블에서 관련된 모든 레코드도 삭제됩니다.
    • SET NULL: 부모 테이블에서 레코드가 삭제되면, 자식 테이블에서 외래키 값이 NULL로 설정됩니다.
    • SET DEFAULT: 부모 테이블에서 레코드가 삭제되면, 자식 테이블에서 외래키 값이 기본값으로 설정됩니다.
    • NO ACTION: 부모 테이블에서 레코드를 삭제하면 아무 일도 일어나지 않으며, 자식 테이블에서의 외래키 제약을 위반할 경우 오류가 발생합니다.
  2. ON UPDATE:

    • CASCADE: 부모 테이블에서 레코드가 업데이트되면 자식 테이블의 외래키 값도 함께 업데이트됩니다.
    • SET NULL: 부모 테이블에서 레코드가 업데이트되면, 자식 테이블의 외래키 값이 NULL로 설정됩니다.
    • NO ACTION: 부모 테이블에서 레코드를 업데이트할 때 아무 작업도 하지 않으며, 외래키 제약을 위반하는 경우 오류가 발생합니다.

외래키 DDL 예시

데이터베이스에서 외래키를 설정하는 DDL(Data Definition Language) 구문은 다음과 같습니다.

1. 테이블 생성 예시 (부서 테이블과 직원 테이블)

-- 부모 테이블 생성 (부서 테이블)
CREATE TABLE department (
    id INT NOT NULL,              -- 부서 ID
    name VARCHAR(100) NOT NULL,   -- 부서 이름
    PRIMARY KEY (id)              -- 기본키
);

-- 자식 테이블 생성 (직원 테이블)
CREATE TABLE employee (
    id INT NOT NULL,              -- 직원 ID
    name VARCHAR(100) NOT NULL,   -- 직원 이름
    department_id INT,            -- 부서 ID (외래키)
    hire_date DATE NOT NULL,      -- 입사일
    salary DECIMAL(10, 2) NOT NULL, -- 급여
    PRIMARY KEY (id),             -- 직원 ID 기본키
    CONSTRAINT fk_department FOREIGN KEY (department_id) 
        REFERENCES department(id)  -- department 테이블의 id를 참조
        ON DELETE CASCADE         -- 부모가 삭제되면 자식도 삭제
        ON UPDATE CASCADE;        -- 부모가 업데이트되면 자식도 업데이트
);

2. 외래키 추가 예시 (기존 테이블에 외래키 추가)

-- 기존 테이블에 외래키 추가 (예: employee 테이블에 외래키 추가)
ALTER TABLE employee
ADD CONSTRAINT fk_department FOREIGN KEY (department_id) 
    REFERENCES department(id)    -- department 테이블의 id를 참조
    ON DELETE SET NULL            -- 부모가 삭제되면 자식의 department_id를 NULL로 설정
    ON UPDATE CASCADE;            -- 부모가 업데이트되면 자식의 department_id도 업데이트

외래키 제약 옵션 설명

  • ON DELETE CASCADE: 부모 테이블에서 레코드가 삭제되면, 자식 테이블에서 관련된 모든 레코드도 자동으로 삭제됩니다.
  • ON DELETE SET NULL: 부모 테이블에서 레코드가 삭제되면, 자식 테이블의 외래키 값이 NULL로 설정됩니다.
  • ON DELETE RESTRICT: 부모 테이블에서 레코드를 삭제할 때, 자식 테이블에서 해당 레코드가 참조되고 있으면 삭제가 거부됩니다.
  • ON DELETE NO ACTION: 부모 테이블에서 레코드를 삭제할 때, 아무런 작업도 일어나지 않으며, 외래키 제약을 위반할 경우 오류가 발생합니다.
  • ON UPDATE CASCADE: 부모 테이블에서 레코드가 업데이트되면, 자식 테이블에서 외래키 값도 자동으로 업데이트됩니다.
  • ON UPDATE SET NULL: 부모 테이블에서 레코드가 업데이트되면, 자식 테이블에서 외래키 값이 NULL로 설정됩니다.

외래키의 장점과 단점

장점

  1. 데이터 무결성 보장:

    • 외래키는 데이터베이스에서 참조 무결성을 유지합니다. 즉, 자식 테이블의 데이터가 부모 테이블의 데이터와 항상 일치하도록 보장하여 데이터가 잘못 연결되는 것을 방지합니다.
  2. 관계 설정:

    • 외래키를 사용하면 여러 테이블 간의 관계를 명확히 정의할 수 있습니다. 예를 들어, 학생 간의 관계, 주문고객 간의 관계 등을 명확히 할 수 있습니다.
  3. 자동화된 데이터 관리:

    • ON DELETE CASCADEON UPDATE CASCADE와 같은 옵션을 사용하여 부모 테이블에서 데이터가 변경되거나 삭제될 때 자식 테이블의 데이터도 자동으로 변경되거나 삭제되도록 할 수 있습니다. 이를 통해 관리가 편리해집니다.
  4. 데이터베이스 설계의 안정성:

    • 외래키는 데이터베이스 설계 시 명확한 관계를 정의하고, 이로 인해 데이터베이스 구조가 안정적이고 이해하기 쉽게 됩니다.

단점

  1. 성능 저하:

    • 외래키 제약은 데이터베이스가 데이터를 삽입하거나 삭제할 때 항상 참조 무결성을 검사해야 하므로, 큰 테이블에서는 성능 저하를 일으킬 수 있습니다.
    • 특히, 부모 테이블에 변경이 있을 때마다 자식 테이블의 데이터를 확인하고, 필요시 업데이트나 삭제를 해야 하므로 시간이 더 걸릴 수 있습니다.
  2. 복잡한 쿼리:

    • 외래키가 많을 경우, 여러 테이블 간의 관계를 처리하는 쿼리가 복잡해질 수 있습니다. 조인(join) 연산이 많아져 쿼리 성능이 떨어질 수 있습니다.
  3. 제약이 강함:

    • 외래키 제약이 적용되면 부모 테이블에서 데이터를 삭제하거나 수정할 때 제약이 걸릴 수 있습니다. 예를 들어, 자식 테이블에 관련 데이터가 존재하는데 부모 테이블의 데이터를 삭제하려고 하면 오류가 발생할 수 있습니다. 이로 인해 원하는 대로 데이터를 관리하는 데 불편함이 있을 수 있습니다.
  4. 유연성 부족:

    • 외래키를 사용하면 관계가 강하게 결합되기 때문에, 데이터베이스 구조 변경 시 유연하게 처리하기 어려울 수 있습니다. 예를 들어, 테이블 간의 관계를 변경하려면 외래키를 제거하거나 수정해야 할 수도 있어 관리가 복잡할 수 있습니다.

요약

  • 장점:

    • 데이터 무결성 유지, 테이블 간 관계 명확화, 자동 데이터 관리, 안정적인 데이터베이스 설계
  • 단점:

    • 성능 저하, 복잡한 쿼리, 강한 제약, 유연성 부족

어린이 버전 요약:

외래키는 테이블을 연결하는 규칙입니다. 예를 들어, 학생 테이블과 반 테이블을 연결할 때 사용됩니다. 외래키를 통해 데이터가 서로 잘 연결되고, 부모 테이블에서 데이터가 삭제되면 자식 테이블도 자동으로 정리됩니다. 다만, 데이터가 많을 때는 속도가 느려질 수 있고, 때로는 데이터를 삭제하거나 수정하는 데 어려움이 있을 수 있습니다.


0개의 댓글