데이터베이스에서 기본 키(Primary Key, PK)는 테이블 내에서 각 행을 유일하게 식별할 수 있는 컬럼(혹은 컬럼들의 조합)을 의미합니다. 기본 키는 테이블에서 중복되지 않는 고유한 값을 가져야 하며, 보통 id
와 같은 단일 컬럼을 기본 키로 설정하는 경우가 많습니다.
복합 키(Composite Key)는 두 개 이상의 컬럼을 결합하여 기본 키로 설정하는 방식입니다. 즉, 하나의 컬럼만으로는 유일한 값을 만들 수 없을 때, 여러 컬럼을 결합하여 고유성을 보장하는 방식입니다.
일반적으로 id
와 같은 단일 기본 키를 사용하는 것이 보편적이지만, 복합 키가 유용한 경우는 다음과 같습니다.
여러 컬럼을 조합하여 유일성을 보장해야 할 때
order_id
와 product_id
가 결합되어야 유일한 값을 생성할 때, 이 두 컬럼을 복합 키로 설정할 수 있습니다. 이 경우 두 개의 외래 키(order_id
와 product_id
)의 조합으로 각 주문 내 상품을 구별할 수 있습니다.별도의 고유한 ID 컬럼을 만들 필요가 없을 때
order_id
, product_id
)을 조합하여 고유성을 보장할 수 있기 때문에, 단일 ID
컬럼을 추가하는 대신 더 직관적이고 의미 있는 방식으로 데이터를 표현할 수 있습니다. 예를 들어, 학생과 과목의 관계를 나타내는 enrollment
테이블에서는 학생 ID와 과목 ID만으로 복합키를 사용할 수 있습니다.Java에서 복합 키를 설정할 때는 @EmbeddedId
또는 @IdClass
를 사용할 수 있습니다.
@EmbeddedId
사용 예시@Embeddable
public class OrderProductId implements Serializable {
private Long orderId;
private Long productId;
// 기본 생성자, getter, setter, equals, hashCode 구현 필수
}
@Entity
public class OrderProduct {
@EmbeddedId
private OrderProductId id;
}
@IdClass
사용 예시@Entity
@IdClass(OrderProductId.class)
public class OrderProduct {
@Id
private Long orderId;
@Id
private Long productId;
}
복합 키와 외래 키는 개념적으로 다릅니다.
order_product
테이블에서 order_id
와 product_id
가 외래 키라면, 이들 각각은 order
와 product
테이블의 기본 키를 참조하여 관계를 맺습니다.복합 키를 사용하면 데이터베이스 설계를 보다 의미 있게 할 수 있습니다. 하지만, 복합 키를 사용할 때는 다음과 같은 점을 고려해야 합니다:
관리의 어려움: 복합 키는 관리가 번거로울 수 있습니다. 여러 컬럼을 조합하여 유일성을 보장하므로, 복합 키를 사용할 때는 각 컬럼들이 결합되어 고유성을 보장하는지 잘 검토해야 합니다.
사용 목적에 맞는 설계: 복합 키는 일반적으로 다대다(N:M) 관계에서 많이 사용됩니다. 예를 들어, 학생
과 과목
의 관계를 나타내는 수강 테이블에서는 복합 키가 적합할 수 있습니다.
효율적인 쿼리 설계: 복합 키를 사용하면 쿼리 성능에 영향을 미칠 수 있습니다. 예를 들어, 복합 키로 구성된 테이블에서 두 컬럼을 조건으로 검색할 때 인덱스 효율성이 높아지는 장점이 있지만, 그만큼 성능을 잘 고려한 인덱스 설계가 필요합니다.
복합 키를 언제 사용해야 할지 고민된다면, 단순히 ID
를 추가하는 것보다 두 컬럼을 조합하여 고유성을 보장하는 것이 더 의미 있는지를 고려하는 것이 좋습니다.