Database ‐ 상속 관계 설계 - woojin-playground/Backend-PlayGround GitHub Wiki

Database - Inheritance Relationship Design

구현 클래스마다 테이블 전략

  • 구현 클래스마다 테이블 전략을 세우는 것은 다음과 같은 장단점이 있다.
  • 장점
    • 구조가 단순하고 직관적이다.
    • 특정 유형만 조회할 때 성능이 좋다.
    • 각 테이블 별로 NOT NULL 제약 조건을 걸 수 있다.
  • 단점
    • 전체 상품을 조회할 때 모든 테이블을 UNION으로 묶어야 하므로 쿼리가 복잡하고 성능이 떨어진다.
    • 상품 ID만으로 어떤 테이블을 봐야 할지 알 수가 없어서 모든 테이블을 찾아야 한다.
    • 다른 테이블에서 FK를 설정할 수 없어 데이터 무결성을 보장하기 어렵다.
    • 공통 속성이 변경되면 모든 테이블을 전부 수정해야 한다.

결론 : 치명적인 단점이 많아서 실무에서 거의 사용하지 않는다.

단일 테이블 전략

  • 단일 테이블 전략을 세우는 것은 다음과 같은 장단점이 있다.
  • 장점
    • 조인이 필요 없어 조회 성능이 가장 우수하다.
    • 쿼리가 단순하고 직관적이다.
    • 외래 키 설정이 가능하며, 상품 ID가 전역적으로 유일하다.
  • 단점
    • 해당 유형이 아닌 컬럼은 모두 NULL로 저장되므로 NULL값이 매우 많아진다.
    • 자식 속성에는 데이터베이스 레벨에서 NOT NULL 제약 조건을 걸 수 없다.
    • 모든 속성을 저장하기 때문에 테이블 크기가 비대해질 수 있다.

결론 : 구조가 단순하고 확장 가능성이 낮을 때 유용하다.

조인 전략

  • 부모 테이블과 자식 테이블을 분리하고 JOIN을 통해 데이터를 조회하는 방식이다.
  • 가장 정규화된 정석적인 방법이기도 하다.
  • 조인 전략은 다음과 같은 장단점이 있다.
  • 장점
    • 데이터가 정규화되어 있어 중복이 없고 저장 공간이 효율적이다.
    • 불필요한 NULL값이 발생하지 않는다.
    • 모든 컬럼에 대해 NOT NULL 제약 조건을 활용할 수 있다.
    • 외래 키 참조가 용이하고 새로운 유형 추가 시 확장성이 좋다.
  • 단점
    • 조회 시 조인이 필요하므로 성능에 영향을 줄 수 있다.
    • 데이터를 등록할 때 부모와 자식 테이블에 각각 쿼리를 날려야 하므로 2번 실행된다.
    • 모든 정보를 한 번에 조회하려면 쿼리가 복잡해진다.(LEFT JOIN 필요)

결론: 데이터 무결성이 중요하고 비즈니스가 복잡할 때 선택하는 가장 추천되는 방식이다.