6. 확장 SQL : 미리보기

다음장부터, 다음의 내용을 추가하여 POSTGRES SQL 질의어를 확장할 수 있는 방법을 알아볼 것이다.

6.1 확장은 어떻게 작동하나

POSTGRES 는 그 작동이 카탈로그 운영(catalog-driven)방식이기 때문에 확장가능하 다. 여러분들이 표준 관계형 시스템에 친숙하다면, 관계형 시스템에서는 데이터 베이스와 테이블, 컬럼 등에 관련된 정보를 시스템 카탈로그라고 불리우는 곳에 저장함을 잘 알것이다. (어떤 시스템에서는 이것을 데이터 사전 (data dictionary) 라고 부른다.) 카탈로그는 사용자에게는 다른 것과 마찬가지로 클래스로 표현되 나, DBMS 는 내부장부를 카탈로그 안에 저장한다. 다른 표준 관계형 시스템과 POSTGRES 가 다른 점은 POSTGRES 는 카탈로그 내부에 좀 더 많은 정보를 저장한다 는 점이다. 저장되는 정보는 테이블과 컬럼에 관련된 정보 뿐만이 아니라, 형 (types), 함수(functions), 접근 방법(access methods) 등등에 관한 정보도 포함된 다. 시스템 카탈로그에 관련된 클래스는 사용자가 변경할 수 있으며, POSTGRES 의 내부적인 작동은 이러한 클래스에 기반한다. 이 의미는 사용자가 POSTGRES 를 확 장할 수 있다는 것이다. 비교를 하자면, 전통적인 데이터베이스 시스템은 DBMS 내 부의 하드코드된 프로시저를 변경하거나, DBMS 공급자가 특별히 제작한 모듈을 적 재함으로써만 확장가능해진다.

POSTGRES 는 다른 대부분의 데이터 관리자와는 달리, 사용자가 작성한 코드를 DBMS 내부로 동적 적재(dynamic loading)를 통해서 포함할 수 있다는 점이다. 사용자는 적재시에 새로운 형(type)과 함수가 정의된 오브젝트 코드 파일 (컴파일된 .o파일, 또는 공유 라이브러리) 를 지정할 수 있으며, POSTGRES 는 요청 대로 적재할 것이다. SQL로 작성된 코드는 더욱 쉽게 DBMS 서버에 추가될 수 있다.

POSTGRES 의 이러한 수정 능력은 특별히 새로운 응용프로그램의 신속한 원형작성 과 저장구조에 적합하다.

6.2 POSTGRES 형(type) 시스템

POSTGRES 형 시스템은 여러가지 방법으로 무력화 시킬 수 있다.

형(type)은 기본(base)형과 복합(composite)형으로 나눌 수 있다. 기본형은 int4 와 같이, C 와 같은 언어에서 사용되는 것들이다. 기본형은 보통 "이론적인 (abstract) 데이터 형"으로 알려진 것들과 일치한다. POSTGRES 는 사용자가 제공한 방법을 통해 기본형 위에서만 작동할 수 있으며, 기본형의 행동을 사용자가 기술한 확장으로만 이해한다. 복합형은 사용자가 클래스를 만들때 생성된다. 'EMP' 는 복합형의 하나의 예이다. POSTGRES 는 복합형을, 클래스의 모든 인스턴스 들이 저장된 파일 내부의 한곳에만 저장하지만, 사용자는 질의어를 사용하여 복합 형의 속성부분에서 내부를 들여다 볼 수 있다. 아울러 해당 속성에서 (예를 들자면) 인덱스를 정의하는 방법으로 복구를 최적화할 수 있다.

아울러 POSTGRES 의 기본형을 내장(built-in)형과 사용자정의(user-defined)형으로 나눌수 있다. int4 와 같은 내장형은 시스템상에 컴파일된 상태로 포함되어 있다. 사용자정의형은 아래에서 설명하는 방법으로 사용자가 만든 것이다.

6.3 POSTGRES 시스템 카탈로그

이제, 카탈로그의 실제적인 윤곽을 살펴보면서, 기본 확장성 개념에 입문해보자. 이장을 건너뛰는 것은 여러분 마음이지만, 뒷부분에서 여기에 나오는 지식이 꼭 필 요하기 때문에 나중을 위해서라도 이 부분을 표시해두자.

시스템 카탈로그의모든 명칭은 'pg_' 로 시작한다. 아래의 클래스는 사용자에게 유용한 정보이다. (다른 시스템 카탈로그도 많이 있으나 직접 질의에서 사용할 경우는 드물 것이다.)
 

카탈로그 이름 설명

pg_database

데이터베이스

pg_class

클래스

pg_attribute

클래스 속성

pg_index

두번째(보조) 인덱스

pg_proc

프로시저 (C 와 SQL)

pg_type

형 (기본형과 복합형)

pg_operator

오퍼레이터

pg_aggregate

집합 및 집합함수

pg_am

엑세스 방법

pg_amop

엑세스 방법 오퍼레이터

pg_amproc

엑세스 방법 제공 함수

pg_opclass

엑세스 방법 오퍼레이터 클래스


레퍼런스 메뉴얼에 이러한 카탈로그와 속성에 대한 좀 더 자세한 설명이 들어있다. 그러나, 그림3은 시스템 카탈로그의 핵심 실체와 이러한 관계를 보여주고 있다. ( 다른 실체를 참조하지 않는 속성은 해당 속성이 프라이머리 키의 일부분이 아닐 경우에는 여기에서 나타나지 않는다.)

이 도표는 실제로 카탈로그의 내용을 보기 전이나 다른 것들과의 상호관계를 살펴보기전에는 다소간 이해하기 어려울 것이다. 이 도표에서 중요한 점은 다음 과 같다.

(1) 이후의 여러장에서, 시스템을 확장하는 데 필요한 정보를 보여주는 시스템 카탈로그상에서 다양한 join 질의를 보게 될 것이다. 이 도표를 살펴보면서 좀 더 이해할 수 있도록 이러한 join 질의(보통 세개나 네개의 join)를 조금 만들어보는 것도 좋을 것이다. 질의에서 사용된 속성이 다른 클래스에서는 외부 키의 형태를 이룬다는 것을 알 수 있다.

(2) 다른 많은 특징 (클래스, 속성, 함수, 형, 엑세스 방법 등)들도 이 스케마 에서 서로 협력한다. 'create' 명령으로 간단히 이러한 카탈로그의 많은 부분을 수정할 수 있다.

[그림 3] POSTGRES 의 핵심 시스템 카탈로그

(3) 타입과 프로시저 (주6)는 이 스케마의 중심이다. 거의 모든 카탈로그는 이러한 클래스의 하나 또는 양쪽 모두에 있는 인스턴스를 참조한다. 예를 들자면, POSTGRES 는 자주 다른 카탈로그의 유일한 인스턴스를 식별하기 위해 형 시그네쳐(함수와 오퍼레이터의)를 사용한다.

주6) 여기서는 다소간의 호환성을 위해 'procedure(프로시저)'와 'function(함수)' 라는 단어를 사용한다.

(4) 분명한 의미를 가지는 많은 속성과 관계가 있으나, 그렇지 않은 것(엑세스 방법 과 함께 동작하는 특정한 것) 도 많다. 'pg_am', 'pg_amop', 'pg_amproc', 'pg_operator', 'pg_opclass' 사이의 관계는 이해하기가 매우 까다롭기 때문에, 기본적인 확장에 대해 알아본 뒤에 좀더 심도깊게 (types과 operators 에 대해 자세하게 설명하는 장에서) 알아볼 것이다.