서론
[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센터 )
'POSTGRESQL' 카테고리의 다른 글
PostgreSQL을 C언어로 사용해보자. (0) | 2023.08.28 |
---|---|
PostgreSQL Extension 소개 (0) | 2023.08.28 |
가장 많이 사용하는 PostgreSQL의 오픈소스 익스텐션은? (0) | 2023.08.28 |
Vacuum이해와 사용법 (0) | 2023.08.28 |
[DB 보안] 국산 암호화 알고리즘 ARIA와 SEED를 활용한 PostgreSQL 데이터베이스 보안 강화 (0) | 2023.08.11 |