[Spring] 1 : 1 관계에서 Shared Primary Key

김민범·2024년 11월 27일

Spring

목록 보기
22/29

여러가지 데이터베이스 연관관계에 대해 공부하던 중, 일대일 연관관계 부분에서 의문이 생겼다.

1 : 1 연관관계에서는 상대방의 PK 하나 당 하나의 데이터만 매칭되는데 그냥 그 FK 를 PK 로 사용할 수 없을까?

검색을 좀 해보니 이미 존재하는 방식이고 공유 기본 키(Shared Primary Key) 라고 불린다.
이에 대한 정보를 정리해보자.

공유 기본 키(Shared Primary Key)

정의
공유 기본 키란 두 개 이상의 테이블에서 동일한 기본 키를 공유하는 관계를 의미한다. 이 방식은 주로 1:1 연관관계에서 사용되며, 자식 테이블이 부모 테이블의 기본 키를 그대로 사용하여 PK와 FK로 동시에 동작하도록 설계된다.


장점

  1. 참조 무결성 유지
    부모-자식 관계에서 강한 결합을 보장하며, 데이터의 일관성을 유지할 수 있다.
  2. 단순화된 키
    자식 테이블에 별도의 기본 키가 없어도 되므로, 테이블 설계가 간소화된다.
  3. 성능 최적화
    추가적인 외래 키를 저장하지 않아도 되어 데이터베이스의 저장 공간을 절약할 수 있다.

단점

  1. 유연성 부족
    자식 테이블이 항상 부모 테이블에 종속적이므로, 독립적인 사용이 어렵다.
  2. 복잡한 삭제/갱신
    부모 테이블이 삭제되면 자식 데이터도 반드시 삭제되어야 하므로, 관계 관리가 까다로울 수 있다.
  3. 확장성 문제
    자식 테이블에 별도의 고유 키가 없으므로, 추가적인 관계를 정의할 때 불편함이 발생할 수 있다.

예시

테이블 구조

  1. User 테이블 (부모)
    CREATE TABLE user (
        id BIGINT PRIMARY KEY,
        name VARCHAR(50)
    );
  2. Address 테이블 (자식)
    CREATE TABLE address (
        user_id BIGINT PRIMARY KEY, -- PK와 FK를 공유
        address VARCHAR(255),
        FOREIGN KEY (user_id) REFERENCES user(id)
    );

추천 상황

  1. 1:1 관계에서 부모-자식의 강한 종속성이 필요할 때 사용한다.
  2. 자식 엔터티가 부모 엔터티 없이는 존재할 수 없는 경우 적합하다.
    • 예: 유저 프로필(Profile)이 항상 특정 유저(User)에 속하는 경우.

추천 상황 예시

  • 회원(User)와 주소(Address)
    회원이 삭제되면 주소도 반드시 삭제되어야 하는 시스템.
  • 상품(Product)와 상세 정보(ProductDetail)
    상품과 그에 대한 세부 정보를 강하게 결합해야 할 때.

대안

  1. 일반 외래 키 설계
    자식 테이블에 별도의 PK를 두고, FK로 부모와 연결.
    • 독립적인 사용이 가능하며, 유연성을 제공한다.
  2. 조합 키(Composite Key)
    부모 키와 자식의 추가 필드를 조합하여 PK로 사용.
    • 다대다 관계를 풀어내거나 더 복잡한 관계에서 활용 가능.

대안 예시

일반 외래 키 설계

  1. Address 테이블
    CREATE TABLE address (
        id BIGINT PRIMARY KEY,       -- 독립적인 PK
        user_id BIGINT,              -- 외래 키
        address VARCHAR(255),
        FOREIGN KEY (user_id) REFERENCES user(id)
    );
  2. 특징
    • 자식 테이블(Address)이 독립적으로 관리 가능.
    • 추가적인 관계 설정 및 확장이 쉬움.

결론

공유 기본 키는 데이터 일관성을 엄격히 유지해야 하는 강한 부모-자식 관계에서 적합하다. 그러나 확장성과 유연성을 위해서는 일반 외래 키 설계가 더 유리한 경우도 많다.

0개의 댓글