데이터베이스 기술/POSTGRESQL

PostgreSQL의 Advanced Feature(Table Inheritance)의 효율적인 사용 방법

(주)비트나인 2023. 8. 21. 17:52

서론

[Powerful Advanced Feature : Table Inheritance]

 PostgreSQL에는 강력한 Table Inheritance 기능은 객체지향 DB의 특징으로 테이블 간에 상속 관계를 설정하는 기능을 말합니다.

 이를 통해 한 테이블(상위 테이블)의 스키마와 데이터를 다른 테이블(하위 테이블)에서 재사용할 수 있게 됩니다. 즉, 상위 테이블의 모든 열과 인덱스가 하위 테이블에서도 그대로 사용되며, 상속 관계를 설정함으로써 데이터 모델링과 관리에 유용한 기능을 제공합니다.

 여기서는 이 Table Inheritance기능을 어떻게 사용하는지 알아보고, 이를 활용하여 데이터를 효율적으로 관리하는 방안과 대용량 데이터를 효율적 저장하는 방안을 알아보겠습니다.

 

본론

[Table Inheritance 문법]


Table Inheritance의 을 정의할 때는 하위 테이블에서 INHERITS 키워드로 상위 테이블을 상속 해 줍니다.

- - 생성 문법
CREATE TABLE {table_name} (
{column define}
) INHERITS ({parent_table_name});

예시는 다음과 같습니다:

위 예제에서 employees 테이블은 모든 직원의 공통 열을 가지고 있고, regular_employees와 contract_employees 테이블은 각각 정규직과 계약직 직원들의 특정 열을 추가로 가지게 됩니다.

 

Table Inheritance는 유연한 데이터 모델링을 가능하게 하며, 복잡한 데이터 구조를 단순화하여 관리할 수 있도록 도와줍니다. 그러나 사용하기 전에 상속의 장단점과 애플리케이션 요구 사항에 맞게 사용할지를 신중하게 고려해야 합니다.



[Table Inheritance의 주요 특징]

 

상위 테이블과 하위 테이블 간의 열 일치: 상위 테이블과 하위 테이블은 열의 구조가 완전히 일치해야 합니다. 상위 테이블에 존재하는 모든 열과 인덱스는 하위 테이블에서도 동일하게 존재해야 합니다.

 

  • 스키마 재사용: 테이블 상속을 사용하면 일반적인 엔티티에 대한 상위 테이블을 만들고, 특정 유형의 엔티티에 대한 하위 테이블을 생성하여 공통 열과 인덱스를 재사용할 수 있습니다.

 

  • SELECT 문 확장: 상속된 테이블의 데이터는 자동으로 상위 테이블에도 포함됩니다. 따라서 SELECT 문을 실행할 때, 상위 테이블을 대상으로 하더라도 하위 테이블의 데이터도 함께 반환됩니다.

 

  • 제약 조건 상속: 테이블 상속은 기본 키, 외래 키, 고유 제약 조건 등을 하위 테이블에도 상속되도록 지원합니다. 이를 통해 데이터의 일관성과 무결성을 유지할 수 있습니다

 

[ONLY 문법의 사용]

Table Inheritance의 ONLY 문법은 특정 쿼리를 실행할 때, 상위 테이블만 대상으로 하고 하위 테이블은 제외하는 기능을 제공합니다. 이를 통해 상위 테이블의 데이터만 조회, 갱신 또는 삭제를 할 수 있습니다.

 

ONLY 문법을 사용하기 위해서는 SELECT, UPDATE 또는 DELETE 문을 실행할 때 테이블 이름 뒤에 ONLY 키워드를 추가하면 됩니다. 이 때, ONLY 키워드를 사용하는 경우 상위 테이블에만 해당 쿼리가 적용되며 하위 테이블은 영향을 받지 않습니다.

 

예시를 통해 이해해 보겠습니다.

 

위의 예제와 연결하여 아래와 같은 ONLY 문법을 사용하여 질의 할 수 있습니다.

위의 예시에서 SELECT 문에서 ONLY 키워드를 사용하면 하위 테이블인 regular_employees와 contract_employees는 조회 대상에서 제외됩니다. 마찬가지로 UPDATE와 DELETE 문에서도 ONLY 키워드를 사용하면 상위 테이블에만 해당 작업이 적용됩니다.

 

위와 같이 ONLY 문법은 Table Inheritance를 사용할 때 특정 작업을 상위 테이블에만 적용하고자 할 때 활용됩니다.

 

※ 부모테이블을 대상으로 하는 쿼리를 작성시 테이블명 뒤에 *를 붙여 상속테이블이 포함될 것임을 표시하는 것을 권장합니다.

  • 예시) select * from employees*;



[논리적인 구분에 의한 효과적인 데이터 관리]

Table Inheritance를 효율적으로 사용하려면 데이터 모델을 잘 설계해야 합니다

Database Modeling 단계중 개념 모델링 과 논리모델링 과정에서 추상화하고 단순화를 진행한 부분을 Table Inheritance를 통해서 실제 Physical 구조로 구현 할 수 있습니다.

 

Case 1) 동작으로 분류한 데이터의 경우

상위 테이블에는 공통적인 속성과 동작을 정의하고, 하위 테이블에는 특정 유형별로 추가적인 속성과 동작을 정의 한 경우

 

질의를 할때 업무에 맞게 ‘animals’ 라는 개념으로 질의 나 관리를 할 수 있게되고, 상세하게는 mammals, birds 와같은 분류로 데이터에 맞게 좀더 세밀한 질의를 할 수 있게 됩니다.

 

Case 2) 상속을 사용하여 월별 테이블 통계 저장

테이블 상속의 가장 일반적인 사용 사례 중 하나는 정보를 월로 나누어 저장하는 것입니다. 이렇게 하면 더 빠른 쿼리를 위해 데이터를 분할할 수 있는 이점이 있습니다.

 

CREATE TABLE example1.logging
(
    id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    event_name character varying NOT NULL,
    start_time timestamp(6) without time zone NOT NULL,
    end_time timestamp(6) without time zone NOT NULL,
    CONSTRAINT february_log_pkey PRIMARY KEY (id, start_time, end_time)
)
CREATE TABLE example1.january_log_2021
(
    CONSTRAINT start_time CHECK (start_time BETWEEN '2021-01-01' and '2021-01-31')
) INHERITS (example1.logging)



Case 3) 분류를 적용한 데이터 관리의 경우 :

상위 테이블은 일반화 한 개념으로 사용하고, 하위 테이블은 각 분류에 맞는 추가 컬럼을 적용 한 경우

 

 

배터리의 중요 4가지 소재에는 양극재, 음극재, 분리막, 전해질 로 구성됩니다.

이 4가지를 ‘소재'라는 항목으로 추상화 하게 된다면 모든 데이터를 ‘소재'로 일반화 하여 ‘소재ID’로 효과적으로 관리 할 수 있게 되고, 각 하위 테이블에서는 추가적인 항목들을 더 넣어서 확장 한 형태로 사용할 수 있습니다.

 

위 Case1 과 Case2에서 알 수 있듯이 DB Modeling을 진행할시 본 기능을 적극 활용하면 효율적인 데이터의 분류 및 관리가 가능합니다.

 

[Partitioning 과 함께 사용하여 효과적인 대용량 데이터의 관리]

Table Inheritance와 Partitioning을 연계하여 하면 PostgreSQL에서 대량의 데이터를 효율적으로 관리하고 성능을 향상시키는데 도움을 줄 수 있습니다. 

 

한 예로 로그를 저장한다고 하였을때 아래 구조를 활용 한다면 2000년, 2010년 데이터는 HDD로 관리하고 신규 2020년 데이터는 SSD로 관리가 가능합니다.

 




[Table Inheritance 사용시 주의 사항]

  • 하위 테이블에 명령을 RENAME적용 할 수 없습니다 . (ALTER TABLE)
  • 기본 키와 외래 키의 고유성은 상속되지 않습니다.
    상속 메커니즘은 상속 계층의 테이블 간에 INSERT 또는 COPY 명령의 데이터를 자동으로 배포할 수 없습니다. INSERT는 지정된 테이블에만 삽입하고 다른 테이블에는 삽입하지 않습니다.
  • 사용자는 상위 테이블과 하위 테이블 모두에 대한 액세스 권한이 있어야 합니다.
  • 열은 수동으로 삭제해야 합니다. (DROP COLUMN)
    계단식 삭제 조건으로 상위 테이블에 명령을 사용하면 하위 테이블에 영향을 줄 수 없습니다.



결론

 Table Inheritance 기능은 본래 기능만으로 개념적이고 논리적인 분류를 통하여 데이터를 효과적으로 관리 할 수 있는 구조를 가질 수 있게 하며 Partitioning 과 함께 사용하며 물리적인 구조또한 효과적으로 구성 할 수 있게 됩니다.

 본 기능은 처음 객체지향 DB에서 그 기능이 시작 하였지만, PostgreSQL에서는 RDBMS 기반으로 RDMS의 개념을 해치지 않고 잘 적용된 기능 입니다.

 보시다 시피 이 기능의 응용 범위는 본연의 기능뿐 아니라 다른기능과의 앙상블은 기대 이상의 효과를 가져다 줄 것입니다.




글 : 임상욱 센터장 ( 비트나인 Hyper DB R&D센터 )