티스토리 뷰

컬렉션, 상속, 컴포지션


컬렉션(Collection)  


여러 개의 데이터 값을 하나의 속성에 저장할 수 있도록 하는 것은 관계형 데이터베이스의 확장 기능이다. 컬렉션의 각 요소는 서로 다른 데이터 타입이 될 수도 있고, 심지어 서로 다른 클래스(단, 가상 클래스 제외) 도메인으로 가질 수도 있다.

CUBRID는 컬렉션 종류로서 다음과 같은 데이터 타입을 제공한다.



컬렉션 명
설명
타입 정의
입력 데이터
저장 데이터
SET
중복을 허용하지 않는 합집합
col_name SET VARCHAR(20)
col_name SET (int, VARCHAR(20))
{'c','c','c','b','b', 'a'}
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'}
{'a','b','c'}
{0,1,2,3,'a','b','c'}
MULTISET
중복을 허용하는 합집합
col_name MULTISET VARCHAR(20)
col_name MULTISET (int, VARCHAR(20))
{'c','c','c','b','b', 'a'}
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'}
{'a','b','b','c','c','c'}
{0,1,2,2,3,3,3,'a','b','b', 'c','c','c'}
LIST(=SEQUENCE)
중복을 허용하고, 데이터 입력 순서대로 저장하는 합집합
col_name LIST VARCHAR(20)
col_name LIST (int, VARCHAR(20))
{'c','c','c','b','b', 'a'}
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'}
{'c','c','c','b','b','a'}
{3,3,3,2,2,1,0,'c','c', 'c','b','b','a'}


LIST(=SEQUENCE)  

LIST의 요소는 중복을 허용하고 여러 종류의 데이터 타입을 가질 수 있고, 다른 클래스의 인스턴스를 가질 수도 있으며 원소들의 순서가 의미가 있는 타입이다.

정의
컬렉션 값의 예
SEQUENCE INTEGER
{20. 40, 60, 80}
LIST CHAR(5)
{ ‘aaa’, ‘bbbb’, ‘ccccc’ }

예제 1
문제
학번(sno), 이름(sname), 학과(sclass), 수강 과목(subjects)를 컬럼으로 갖는 학생 테이블(student)를 생성하라. 수강 과목은 LIST(VHARCAR) 타입을 이용하라.

테이블 생성 SQL문
CREATE TABLE STUDENT (
     sno INT,
     sname VARCHAR(20),
     sclass VARCHAR(30),
     subject LIST(VARCHAR(20))
);

INSERT INTO student VALUES ( 1, 'Susan', 'Computer', { 'JAVA', 'C' } );
INSERT INTO student VALUES ( 2, 'Michel', 'Computer', { 'Algorithm', 'Structure', 'File System' } );
INSERT INTO student VALUES ( 3, 'Brown', 'History', { } ); 
     
SELECT * FROM student;


결과 테이블
no
sno
sname
sclass
subject
1
1
Susan
Computer
{JAVA, C}
2
2
Michel
Computer
{Algorithm, Structure, File System}
3
3
Brown
History
{}



SET  

SET의 요소는 중복된 값을 입력하면 큐브리드는 자동으로 중복된 값을 제거하며 여러 종류의 데이터 타입을 가질 수 있고, 다른 클래스의 인스턴스를 가질 수도 있다.

정의
입력 데이터
저장 데이터
SET VARCHAR(10)
{ ‘golf’, ‘scuba’, ‘golf’ }
{ ‘golf’, ‘scuba’ }

예제 2
문제
학번(sno), 이름(sname), 학과(sclass), 수강 과목(subjects)를 컬럼으로 갖는 학생 테이블(student)를 생성하라. 수강 과목은 SET(VHARCAR) 타입을 이용하라.

테이블 생성 SQL문

CREATE TABLE student (
     sno INT,
     sname VARCHAR(20),
     sclass VARCHAR(30),
     subject SET(VARCHAR(20))
);

INSERT INTO student VALUES ( 1, 'Susan', 'Computer', { 'JAVA', 'C', 'JAVA' } );
INSERT INTO student VALUES ( 2, 'Michel', 'Computer', { 'Algorithm', 'Structure', 'File System' } );
INSERT INTO student VALUES ( 3, 'Brown', 'History', { 'Rome', 'Rome' } ); 
    

SELECT * FROM student;



결과 테이블
no
sno
sname
sclass
subject
1
1
Susan
Computer
{C, JAVA}
2
2
Michel
Computer
{Algorithm, File System, Structure}
3
3
Brown
History
{Rome}



MULTISET  

MULTISET 타입은 SET 타입과 유사하지만 중복을 허용하는 집합을 나타낼 때 사용한다. 하지만 원소들의 순서는 중요하지 않다.

정의
컬렉션 값의 예
MULTISET INTEGER
{ 10, 20, 10, 80 }
MULTISET CHAR(5)
{ ‘aaa’, ‘bbbb’, ‘ccccc’ }

예제 3
문제
학번(sno), 이름(sname), 학과(sclass), 수강 과목(subjects)를 컬럼으로 갖는 학생 테이블(student)를 생성하라. 수강 과목은 MULTISET(VHARCAR) 타입을 이용하라.

테이블 생성 SQL문
CREATE TABLE STUDENT (
     sno INT,
     sname VARCHAR(20),
     sclass VARCHAR(30),
     subject MULTISET(VARCHAR(20))
);

INSERT INTO student VALUES ( 1, 'Susan', 'Computer', { 'JAVA', 'C', 'JAVA' } );
INSERT INTO student VALUES ( 2, 'Michel', 'Computer', { 'Algorithm', 'Structure', 'File System' } );
INSERT INTO student VALUES ( 3, 'Brown', 'History', { 'Rome', 'Rome' } ); 
     
SELECT * FROM student;


결과 테이블
no
sno
sname
sclass
subject
1
1
Susan
Computer
{C, JAVA, JAVA}
2
2
Michel
Computer
{Algorithm, File System, Structure}
3
3
Brown
History
{Rome, Rome}



상속(Inheritance)  


상속은 객체 관계 개념에서 유용한 것 중 하나이다. 상속은 부모 테이블에서 생성된 컬럼과 메소드들을 자식 테이블에서 재사용할 수 있게 한다. 큐브리드는 다중 상속을 지원함으로써 강력한 재사용성을 제공하고, 다중 상속 간의 충돌 문제를 해결할 수 있는 방법을 제공한다.

예제 4
문제
이름(name), 나이(age), 성별(sex) 컬럼을 가진 PEOPLE 테이블을 생성하라.

테이블 생성 SQL문
CREATE TABLE people ( 
     name VARCHAR(20),
     age INT,
     sex CHAR(1)
);



예제 5
문제
PEOPLE 테이블을 상속 받고, 학번(sno), 학과(sclass), 수강 과목(subject) 컬럼을 가진 student 테이블을 생성하라.

테이블 생성 및 데이터 삽입 SQL문

-- student 테이블 생성 SQL문
CREATE TABLE student UNDER people (
     sno INT,
     sclass VARCHAR(30),
     subject MULTISET(VARCHAR(20))
);


-- student 테이블에 데이터 삽입 SQL문 >
INSERT INTO student VALUES ('Michel', 21, 'M', 1, 'Computer', {'JAVA',' C'});
INSERT INTO student VALUES ('Susan', 20, 'F', 2, 'History', {'Rome'});
    

-- student 테이블 생성 SQL문 >
SELECT * FROM student;



결과 테이블
no
name
age
sex
sno
sclass
subject
1
Michel
21
M
1
Computer
{ JAVA, C }
2
Susan
20
F
2
History
{ Rome }

설명
위의 INSERT문을 보면 PEOPLE 테이블의 컬럼 값들이 입력된 것을 알 수 있다. 이처럼 UNDER 키워드를 이용하여 테이블을 상속받을 수 있다.


예제 6
문제
PEOPLE 테이블을 상속 받고, 교번(pno), 학과(pclass), 담당 과목(subject), 월급(salary) 컬럼을 가진 professor 테이블을 생성하라.

테이블 생성 및 데이터 삽입 SQL문
-- professor 테이블 생성 SQL문
CREATE TABLE professor UNDER people (
     pno INT,
     pclass VARCHAR(30),
     subject VARCHAR(20),
     salary INT
);

-- professor 테이블에 데이터 삽입 SQL문
INSERT INTO professor VALUES ('Jackson', 54, 'M', 1, 'Computer', 'JAVA', 5000000); 
     
-- professor 테이블 출력 SQL문
SELECT * FROM professor;


결과 테이블
no
name
age
sex
pno
pclass
subject
salary
1
Jackson
54
M
1
Computer
JAVA
5000000

설명
위의 INSERT문을 보면 Student 테이블과 마찬가지로 PEOPLE 테이블의 컬럼 값들이 입력된 것을 알 수 있다.


예제 7
문제
PEOPLE 테이블을 삭제하고 professor 테이블을 조회하라.

테이블 생성 및 데이터 삽입 SQL문
-- people 테이블 삭제 SQL문
DROP FROM people;

-- professor 테이블 출력 SQL문
SELECT * FROM professor;


결과 테이블
no
pno
pclass
subject
salary
1
1
Computer
JAVA
5000000

설명
People 테이블을 삭제하면 해당 테이블을 상속 받고 있는 테이블들과의 상속 관계는 사라지므로 people 테이블의 이름(name), 나이(age), 성별(sex) 컬럼도 조회되지 않는다.



컴포지션(Composition)  


컴포지션은 객체 관계형 데이터베이스의 중요한 특징 중 하나이다. 테이블은 특정 테이블의 객체를 하나의 컬럼으로 가지고 있을 수 있기 때문에 별도의 조인 연산이 필요 없게 된다.

예제 8
문제
국가 코드(code), 국가 명(name), 대륙 명(continent), 수도 명(capital) 컬럼을 가진 국가 테이블(info_nation)을 생성하고 이름(name), 소속 국가(nation_code) 컬럼을 가진 사람 테이블(info_people)을 생성하고 각각의 데이터를 입력한 후 두 테이블을 조인하여 이름(name), 국가 명(name), 대륙 명(continent), 수도 명(capital) 컬럼 순으로 출력하는 쿼리문을 작성하라.

SQL문
-- info_nation 테이블 생성 SQL문
CREATE TABLE info_nation (
     code CHAR(3), 
     name VARCHAR(20),
     continent VARCHAR(20),
     capital VARCHAR(20)
);

-- info_nation 테이블에 데이터 삽입 SQL문
INSERT INTO info_nation VALUES('KOR', 'Korea', 'Asia', 'Seoul');
INSERT INTO info_nation VALUES('ITA', 'Italy', 'Europe', 'Rome'); 
    
-- info_people 테이블 생성 SQL문
CREATE TABLE info_people (
     NAME VARCHAR(20),
     nation_code CHAR(3)
);

-- info_people 테이블에 데이터 삽입 SQL문
INSERT INTO info_people VALUES ('Park Ji-Sung', 'KOR');
INSERT INTO info_people VALUES ('Susan', 'ITA'); 
     
-- info_people 테이블 출력 SQL문
SELECT p.name, n.name, n.continent, n.capital
FROM info_nation n, info_people p
WHERE n.code = p.nation_code;


결과 테이블
no
name
name
continent
capital
1
Park Ji-Sung
Korea
Asia
Seoul
2
Susan
Italy
Europe
Rome


예제 9
문제
이름(name), info_nation 테이블 객체 컬럼을 가진 사람 테이블(info_people_ref)을 생성하고 각각의 데이터를 입력한 후 해당 객체를 참조하여 이름(name), 국가 명(name), 대륙 명(continent), 수도 명(capital) 컬럼 순으로 출력하는 쿼리 문을 작성하라.

SQL문
-- info_people_ref 테이블 생성 SQL문
CREATE TABLE info_people_ref ( 
     name VARCHAR(20),
     info_nation info_nation
);

-- info_people_ref# 테이블에 데이터 삽입 SQL문
INSERT INTO info_people_ref VALUES ('Park Ji-Sung',
(SELECT info_nation.IDENTITY FROM info_nation WHERE code='KOR')); 
INSERT INTO info_people_ref VALUES ('Susan',
(SELECT info_nation.IDENTITY FROM info_nation WHERE code='ITA')); 
    
-- info_people_ref 테이블 출력 SQL문
SELECT name, info_nation.name, info_nation.continent, info_nation.capital
FROM info_people_ref;


결과 테이블
no
name
info_nation.name
info_nation.continent
info_nation.capital
1
Park Ji-Sung
Korea
Asia
Seoul
2
Susan
Italy
Europe
Rome

설명
위의 INSERT문을 보면 code=’KOR’인 레코드의 OID 값을 SELECT 하여 해당 객체 컬럼에 삽입하는 것을 볼 수 있다. 이렇게 삽입된 객체 컬럼은 아래 결과 테이블 SELECT문처럼 별도로 조인할 필요가 없이 해당 객체의 국가 명(name)과 대륙 명(continent), 수도 명(capital)을 바로 참조하여 SELECT 할 수 있다.

 


출처 : http://cafe.naver.com/studycubrid.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=702
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크