본문 바로가기

Database/DB

객체 지향 데이터베이스 (OODB / object-oriented Database)

객체지향 데이터베이스

객체 지향 데이터베이스는 객체 지향 패러다임을 사용하는 객체지향 프로그래밍에서 영향을 받아 생성되었다. 객체지향 프로그래밍과 마찬가지로 실세계의 객체를 DB로 표현하기 위해 만들어졌었다.

객체 표현을 관리하는 데이터베이스 기술, ODMG 2.0 표준으로 기술되어 있다.

 

객체 모델의 핵심 기능은 다음과 같습니다.

  • 속성 및 관계 개체 속성
  • 개체 작업 (동작) 및 예외
  • 다중 상속
  • 범위 및 키
  • 개체 이름 지정
  • Atomic, structured and collection literals
  • List, set, bag and array collection classes
  • 동시성 제어 및 객체 잠금

객체 관계 데이터베이스를 위한 데이터 언어 표준으로 ISO에서 제시한 SQL3가 있다.

 

참고로 객체지향 데이터베이스는 20년 전에 탄생 후 관계형 데이터베이스의 성장으로 더 이상 크지 않았다

 

1. 커스텀 데이터 타입 (object types)

1
2
create type point as(x float, y float);
create type line as(begin point, end point);
cs

c언어에서의 스트럭쳐와 비슷하다. 단  데이터 타입의 선언은 테이블의 칼럼으로 선언할 순 없다. 테이블은 오직 DB에서 제공하는 타입만으로 선언이 가능하다.

 

1.1 object types 사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 함수 및 프로시져에서 선언으로 사용이 가능하다. 
 
CREATE OR REPLACE FUNCTION two_point_distance(x1 float, y1 float, x2 float, y2 float)
RETURNS INTEGER AS $$
DECLARE
    p1 point;
    p2 point;
BEGIN
    p1 := point(x1, y1);
    p2 := point(x2, y2);
 
    RETURN sqrt(pow(p1[0- p2[0], 2+ pow(p1[1- p2[1], 2));
END;
$$ LANGUAGE plpgsql;
 
select two_point_distance(1.02.0-1.0-10.0); # 12
 
 
cs

아래와 같이 파라미터로 넘겨주는것도 가능하다.

1
2
3
4
5
6
7
8
9
CREATE OR REPLACE FUNCTION two_point_distance(p1 point, p2 point)
RETURNS INTEGER AS $$
DECLARE
BEGIN
    RETURN sqrt(pow(p1[0- p2[0], 2+ pow(p1[1- p2[1], 2));
END;
$$ LANGUAGE plpgsql;
 
select two_point_distance(point(1.02.0), point(-1.0-10.0));
cs

2. 상속

클래스들은 클래스 계층 구조를 가질 수 있으며, 계층 구조를 통해 속성과 메서드를 상속할 수 있다. 예를 들면, Employee 클래스로부터 속성과 메서드를 상속하는 Manager 클래스를 생성할 수 있다. 이때 Manager 클래스는 Employee 클래스의 서브클래스라고 하고, Employee 클래스는 Manager 클래스의 슈퍼클래스라고 한다. 상속을 이용하면 이미 존재하는 클래스의 구조를 재사용하므로 간단하게 클래스를 생성할 수 있다.

 

테이블 생성시에 하나이상의 다른 테이블로부터의 상속 기능을 제공한다.

상속받은 테이블을 자식테이블, 상속 대상 테이블을 부모 테이블로 할 때 자식 테이블을 create table 시 INHERITS 옵션을 이용하여 부모 테이블의 칼럼, check / not-null 제약조건을 상속받는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int  -- 고도
);
 
CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);
 
# 테이블 정보 확인
select * from information_schema.columns
where table_name = 'capitals' order by column_name;
cs

이 경우 capitals 행은 상위 테이블 cities 에서 모든 열 ( name , population 및 elevation )을 상속한다.

 


번외 상속 테이블 확인

pg_inherits 테이블은 상속에 대한 정보를 기록한다.

계층. 직계 자식 테이블마다 하나의 항목이 있으며, inhrelid 는 자식 테이블, inhparent는 부모 테이블로 기록된다.

아래는 capitals 테이블이 자식 테이블로 설정되어 있는지 확인하는 쿼리이다.

1
2
3
4
5
6
7
select * from pg_inherits;
 
SELECT EXISTS (
   SELECT 1
   FROM   pg_catalog.pg_inherits
   WHERE  inhrelid = 'public.capitals'::regclass
   )
cs

 

부모 테이블의 check 제약 조건과 NOT NULL 제약은 자식 테이블에 자동으로 상속된다.

부모 테이블의 Unique 제약 조건 기본 키, 외래 키 제약 조건은 상속되지 않는다.

 

2.1 데이터 입력

두개의 데이터는 cities(부모) 테이블에 하나는 capitals(자식) 테이블에 입력

1
2
3
4
5
6
7
insert into cities values ('Las Vegas'10000 , 1111);
insert into cities values ('Mariposa'20000 , 2222);
insert into capitals values ('seoul'30000 , 33333);
 
select * from cities;
 
select * from capitals;
cs

cities(부모) 테이블에 3개의 데이터가 모두 들어있다. 자식 테이블에 데이터 입력 시 자동으로 부모 테이블에도 입력된다.

 

capitals(자식)에는 자신의 데이터만 존재 한다.

 

 

2.2 검색

1
2
3
SELECT name, altitude
    FROM  cities
    WHERE altitude > 2000;
cs

cities(부모 테이블)에서 검색 시 altitude이 2000 초과의 값을 검사하여 두 개의 데이터가 리턴된다.

만일 자식 데이터는 제외하고 싶다면 'only' 키워드를 추가하면 된다.

1
2
3
SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 2000;
cs

위의 검색을 실행계획을 보면 차이를 알 수 있다.

먼저 첫 번째 쿼리의 경우 두 개의 테이블 cities, capitals 모두 검색 후 Append 한다는 것을 알 수 있다.

1
2
3
4
5
6
7
QUERY PLAN
Append  (cost=0.00..26.34 rows=361 width=36) (actual time=0.017..0.054 rows=2 loops=1)
  ->  Seq Scan on cities cities_1  (cost=0.00..2.41 rows=38 width=36) (actual time=0.016..0.016 rows=1 loops=1)
        Filter: (altitude > 2000)
        Rows Removed by Filter: 1
  ->  Seq Scan on capitals cities_2  (cost=0.00..22.12 rows=323 width=36) (actual time=0.022..0.033 rows=1 loops=1)
        Filter: (altitude > 2000)
cs

'ONLY' 키워드를 사용한 두 번째 쿼리는 cities 테이블만 스캔한 것을 알 수 있다.

1
2
3
4
QUERY PLAN
Seq Scan on cities  (cost=0.00..2.41 rows=38 width=36) (actual time=0.009..0.009 rows=1 loops=1)
  Filter: (altitude > 2000)
  Rows Removed by Filter: 1
cs

 

 

2.3 변경

부모 테이블에 대한 조회/수정/삭제 SQL은 자식 테이블을 포함하여 조회/수정/삭제되며 된다. 자식테이블을 수정하면 마찬가지로 부모 테이블의 데이터도 수정된다.

1
2
3
4
update capitals set population = 40000, altitude = 40000
where name = 'seoul';
 
select * from cities;
cs

capitals(자식 테이블)의 데이터를 수정하면 cities(부모 테이블)의 데이터도 변경된다.

데이터베이스 유지 관리 및 조정을 수행하는 명령 (예 : REINDEX , VACUUM )은 개별 테이블에서만 작동하며 상속 계층 구조에 대한 반복을 지원하지 않는다.

상속 기능의 심각한 제한 사항은 인덱스 (고유 제약 조건 포함)와 외래 키 제약 조건이 상속 자식이 아닌 단일 테이블에만 적용된다는 것입니다. 외래 키 제약 조건의 참조 및 참조 측면 모두에 해당된다.

우리가 cities  테이블 선언 시 name 칼럼을 UNIQUE 또는 PRIMARY KEY 지정했다면,  capitals 테이블에 상속되지 않는다. 이 경우 동일한 REFERENCES 제약 조건을 capitals로 수동으로 추가하면이 문제를 해결할 수 있다.

상속 계층 구조로 구현되지 않은 일부 기능은 선언적 파티셔닝을 통해 구현할 수 있다. 레거시 상속을 통한 분할이 응용 프로그램에 유용한 지 여부를 결정하는 데 상당한 주의가 필요합니다.

 

참고

https://www.postgresql.org/docs/8.3/ddl-inherit.html

https://runebook.dev/ko/docs/postgresql/tutorial-inheritance

https://corekms.tistory.com/entry/table-inheritance상속

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Database > DB' 카테고리의 다른 글

파티셔닝 실습 - postgresql  (0) 2021.06.22
파티션 개념  (0) 2021.06.21
LeetCode sql 문제, 유저별 월별 집계  (0) 2021.05.20
postGIS 쿼리 튜닝  (0) 2021.04.24
postgreSQL core  (2) 2020.06.15