5.2 데이터베이스 스키마

데이터베이스 스키마는 생성스키마, 적재스키마로 구분된다. 생성스키마는 데이터베이스 및 테이블의 관리(생성/삭제)에 필요한 각종 정보를 정의하고 적재스키마는 적재문서의 구조 적재파일의 위치정보등 문서적재에 관한 정보를 정의한다.

5.2.1 생성 스키마

데이터베이스 생성 스키마는 데이터베이스 및 테이블의 관리에 필요한 각종 정보를 담고 있는 XML 파일이다. 스키마내에서 사용하는 모든 값들은 XML문서 속성을 그대로 수용하기 때문에 각 값들의 대소문자에 유의하여 작성하여야 한다.

표 5.1. 생성스키마

부분기능엘리먼트비고
데이터베이스 정의데이터베이스 생성<CreateDatabase database-name="..." volume-dir="..." />처음 생성시 사용 (DB가 있었다면 초기화됨)
데이터베이스 사용<UseDatabase database-name="..." volume-dir="..." />기존에 생성된 DB를 사용
사용자영역 정의사용자영역 생성<CreateUserArea> .... </CreateUserArea>>관리자가 필요한 정보를 세팅
테이블스키마 정의테이블스키마생성<CreateTableSchema name="..." use-aux-db=".." doc-type="..." alias="..."> ...하위 정보 정의 부분...</CreateTableSchema> 처음 생성시 사용 (DB가 있었다면 초기화됨)
기본 키 정의 <PrimaryKey sections="..." /> 데이터베이스에서 사용할 기본키 정의 정의하지 않으면 "문서식별자"를 기본키로 사용
불용어 정의 <Stopword file="..." /> 불용어 정의
기본섹션 정의 <BasicSection name="..." data-type="..." index-type="..." index-remove-element-tag="..." use-stemming="..." remove-stopword="..." hanja-to-hangul="..." use-index-bigram="..." default-value="..." alias="..." /> 기본섹션에 대한 색인방법 등의 다양한 옵션 정의
가상섹션 정의 <VirtualSection name="..." source-section="..." index-type="..." index-remove-element-tag="..." use-stemming="..." remove-stopword="..." hanja-to-hangul="..." use-index-bigram="..." alias="..." /> 가상섹션에 대한 색인방법을 정의
통합섹션 정의 <UnionSection name="..." include-sections="..." alias="..." /> 통합섹션은 실제 색인을 수행하지않고, 검색시에만 기본섹션으로 질의를 확장한다
테이블 정의 테이블 생성 <CreateTable table-name="..." with-schema="..." alias="..." doc-type="..." /> 특정 스키마를 사용한 테이블 생성 정의

5.2.1.1 데이터베이스 정의

가. 데이터베이스 생성

<CreateDatabase database-name="..." volume-dir="..." /> database는 하나의 서버로 서비스하는 단위로서, 여러개의 스키마(서로 다른 테이블 구조)로 구성될 수 있다. CreateDatabase는 최초 생성시에 사용하는 명령이다.

나. 데이터베이스 사용

<UseDatabase database-name="..." volume-dir="..." /> 기존에 구성되어 있는 database에 새로운 내용을 추가할 때 사용하는 명령이다. 새로운 스키마를 생성할 수도 있고, 기존의 스키마에 새로운 테이블을 추가하여 생성할 때 사용한다

5.2.1.2 사용자 영역 정의

<CreateUserArea>
	Description on the text
	<![CDATA[
		test test
		]]>
</CreateUserArea>
						

사용자 영역은 데이터베이스에 관리자의 편의를 위하여 생성하는 정보로서, 데이터베이스 설명, 정책 등 관리자가 필요한 사항을 자유로이 기술하여 데이터베이스에 수록할 수 있는 영역이다.. 특정 형식이 정해져 있지 않기 때문에, 스키마를 이용하여 임의의 문자열로 구성된 정보 영역을 생성하고 클라이언트 라이브러리 API를 이용하여 사용자 영역을 획득할 수 있다 사용자는 CreateUserArea 엘리먼트 내부에 TEXT파트나 CDATA 형식의 혼합된 형태로 내용을 작성할 수 있지만, 텍스트 부분의 양끝 공백문자(스페이스, 탭) 와 개행문자(\r,\n)은 제거된다.

5.2.1.3 테이블 스키마 정의

가. 테이블 스키마 생성
<CreateTableSchema name="blue_table" use-aux-db="no"  doc-type="plain" alias="blue database">
	...하위 정보 정의 부분...
<CreateTableSchema>
								

KRISTAL은 여러 개의 스키마를 정의할 수 있으며, KRISTAL에서 생성되는 테이블들은 이미 정의되어 있는 스키마 중 하나를 선택하여 그 구조로 만들어진다. CreateTableSchema 하위에 주요키 , 기본섹션, 가상섹션, 통합섹션 등을 정의하는 서브엘리먼트들이 위치하게 된다. 내부 속성은 name, use-aux-db, doc-type, alias 네 가지가 있으며 name은 필수항목이고, 나머지는 옵션이다. use-aux-db는 정의하지 않으면 디폴트로 no로 세팅되며, 문서관리작업시 보조DB를 사용하지 않는 구조로 운영된다. 데이터의 갱신이 적거나 소규모의 DB에서는 속도에 큰 무리없이 문서관리작업을 할 수 있으므로 "no"를 선택하면 되고, 데이터의 갱신이 빈번하거나 대용량 DB에서의 신속한 문서갱신이 요구된다면 "yes"를 선택하여 보조DB를 사용해야 한다. 보조DB를 사용하는 경우, 갱신작업이 어느 정도 행해진 후에 optimizing 작업을 수행해야 이후 갱신작업에 대한 속도가 빠르게 유지되므로 주의하여야 한다. doc-type을 정의하지 않으면 디폴트로 plain으로 세팅되며, 사용자가 다루는 문서가 구조문서라면 "xml"로 정의해야 한다. alias는 현재는 영문을 사용해야 한다.

나. 기본키 정의
<PrimaryKey sections="AN" />
<PrimaryKey sections="AN ANI" />
							

데이터관리시 데이터들 간의 중복관계를 확인함으로써 효율적인 데이터 관리를 도모하기 위해서 정의하는 부분으로, 정의가 생략되면 "문서식별자"가 기본키가 된다. 기본키는 "기본섹션"의 집합으로 이루어지며, 두 개 이상을 지정하려면 두번째 예와 같이 sections속성에 "공백문자"를 이용하여 기본섹션들을 계속 지정하면 된다. 기본키는 테이블별로 생성되므로, 테이블간의 기본키 중복은 사용자의 책임이 된다.

다. 불용어 정의
<Stopword file="/home/demo/DEMO/stopword/swords-eng"/>
<Stopword file="/home/demo/DEMO/stopword/swords-han"/>
							

불용어(stopword)란 검색에서 불필요하다고 정의되는 단어들이다. 영문에서는 관사, 형용사, 부사등을 한글에서는 부사, 형용사 등이 주로 불용어로 취급된다. 위의 예처럼 여러 개의 불용어 파일을 동시에 정의할 수 있으며, 정의된 파일들은 통합되어 관리된다. 불용어에 대한 사용은 "기본섹션 정의" 및 "가상섹션 정의"에서 각 섹션별로 지정한다.

라. 기본섹션 정의

표 5.2. 기본섹션 관련 엘리먼트

속성내용디폴트값비고
name기본 섹션의 이름을 지정한다. 영문을 사용할 것을 권장하며, 향후 관리의 편의성을 위해 짧게 지정하는 것이 좋다. 대소문자를 구분한다.--
data-type기본 섹션의 데이터 타입을 지정한다. KSTRING, KCHAR, KINT, KUNIT 등 데이터 값의 형태에 따라 선택하여 사용할 수 있다.--
index-type 기본 섹션의 색인 타입을 지정한다. (KRISTAL-III의 데이터 타입 및 색인 타입에 관한 것은 4장 색인형식을 참조하기 바란다.) DO_NOT_INDEX-
index-remove-element-tag XML 문서의 경우 색인시 엘리먼트와 에트리뷰트 값의 고려 유무를 선택하도록 한다. "YES"값의 경우 엘리먼트와 에트리뷰트를 모두 제거한 후 색인을 한다. 기본값은 "NO"이다. NO-
use-stemming 색인 시 스테밍(Stemming)을 사용할 지 여부를 결정한다. 스테밍은 동일한 의미를 지니고 있는 서로 다른 형태의 단어들을 단일 형태로 통일한다. 예를 들면 문서에 출현한 represent, represents, represented라는 단어들은 represent라는 원형으로 변환된다. KRISTAL의 스테밍은 영어권을 대상으로 한다. 해당 속성 값으로는 "YES" 또는 "NO"를 사용할 수 있는데, "YES" 값이 지정되면 스테밍 처리를 수행함을 의미하고, "NO" 값은 스테밍 처리를 수행하지 않음을 의미한다. 기본값은 "NO"이다. NO-
remove-stopword 색인 시 불용어 처리의 여부를 정의하는 것으로, "YES" 또는 "NO"의 값을 가질 수 있다. "YES" 값이 지정되면 불용어 처리를 수행함을 의미하고, "NO" 값은 불용어를 제거하지 않음을 의미한다. 기본값은 "no"이다. NO-
hanja-to-hangul 색인 시 문서에 출현하는 한자어를 한글로 변환하여 색인 할지 여부를 결정한다. "YES"값이 지정되면 한자어를 한글로 변환하여 색인 함을 의미하고, "NO"는 변환을 하지 않은 채로 색인 함을 의미한다. 기본값은 "NO"이다. NO-
use-index-bigram 이미 지정된 색인 방법이외에 단어 단위 바이그램을 적용할지 여부를 지정함. "YES"값이 지정되면 추가적으로 바이그램 방식의 색인어가 추자적으로 생성된다. 기본값은 "NO"이다. NO-
default-value 해당 섹션의 기본 값을 지정하기 위한 속성으로, 데이터 적재 시 해당 섹션 값이 명시되지 않은 경우 이 속성 값을 해당 문서의 섹션 값으로 정의한다. 섹션값이 존재하지 않는 문서를 관리하기 위한 방편으로 사용할 수 있다. 다만 이 값은 특수한 값을 사용하여 검색에 영향을 미치지 않도록 주의하여 한다. NULL-
alias 테이블 스키마를 구분하기 위한 대체 이름을 지정한다. 섹션의 이름이 어려울 경우에는 alias를 이용하면 관리자가 알기 쉬운 별칭으로 섹션을 지정할 수 있는 장점이 있다. NULL-
delimit-chars토큰 추출시에 사용할 구분자 지정NULLINDEX_BY_TOKEN에서만 유효
delete-charsdelimit-chars로 추출된 토큰에서 제거할 문자를 지정NULL"

테이블 내의 기본 섹션을 정의한다. 기본섹션은 하나의 문서를 구성하는 가장 기본적인 단위이다.

마. 가상섹션 정의

가상섹션(Virtual section)은 기본 섹션에 대해서 추가적인 색인형식을 정의 하거나, 두 개 이상의 섹션을 묶어서 한꺼번에 색인형식을 정의할 때 사용한다.

표 5.3. 가상섹션 관련 엘리먼트

속성내용비고
name가상 섹션의 이름을 정의-
source-section가상섹션 정의 대상이 되는 기본섹션(들)을 지정-
index-type기본섹션과 동일-
index-remove-element-tag기본섹션과 동일-
use-stemming기본섹션과 동일-
remove-stopword기본섹션과 동일-
hanja-to-hangul기본섹션과 동일-
use-index-bigram기본섹션과 동일-
alias기본섹션과 동일-
바. 통합섹션 정의

통합섹션(Union sectoin)은 기본 섹션들이나 가상 섹션들 또는 둘의 조합을 묶어 하나의 섹션 이름에 대응 시킨 형태의 논리적 섹션으로서, 검색의 편의성을 위하여 사용하는 일종의 대표 검색 섹션으로, 이를 이용하면 사용자의 검색 질의를 매우 단순화할 수 있다.

표 5.4. 통합섹션 관련 엘리먼트

속성내용비고
name통합 섹션의 이름을 정의-
include-sections대상이 되는 기본 섹션 및 가상 섹션들을 지정-
alias기본섹션과 동일-

5.2.1.4 테이블 정의

5.2.1.3에서 정의된 테이블스키마를 이용하여 실제 데이터를 저장하기 위한 테이블에 대한 생성을 정의한다.

표 5.5. 테이블정의 엘레멘트

속성내용비고
table-name생성할 테이블 이름을 지정한다-
with-schema테이블생성에 사용할 테이블 스키마 이름을 지정-
alias테이블 스키마를 구분하기 위한 대체 이름을 지정-
<?xml version="1.0" ?>

<!-- Example KRISTAL Database Schema file -->
<!-- data-type: KINT, KFLOAT, KBOOL, KSTRING, KCHAR -->
<!-- All value is case-insensitive. -->
<DatabaseSchema>
    <CreateDatabase database-name="BLUE_DB" 
        volume-dir="/home/demo/DEMO/volume" />
    <!-- Table Schema Definitions -->
    <CreateTableSchema name="blue_table" alias="blue database">

        <!-- Primary Key Definition -->
        <PrimaryKey sections="AN"/>

        <!-- Stopword File Definition -->
        <Stopword file="/home/demo/DEMO/stopword/swords-eng"/>
        <Stopword file="/home/demo/DEMO/stopword/swords-han"/>

        <!-- Basic Section Definitions -->
		<BasicSection  name="AN"
                          alias="access number"
                          data-type="KCHAR[10]" 
                          index-type="INDEX_AS_IS" />
        <BasicSection  name="ANI" 
                          alias="access number integer" 
                          data-type="KINT" 
                          index-type="INDEX_AS_NUMERIC" />
                           .............
        <BasicSection  name="URL" 
                          alias="url" 
                          data-type="KSTRING" 
                          index-type="INDEX_AS_IS" />

        <!-- Virtual Section Definitions -->
		<VirtualSection name="VIR_CLS" 
                           alias="virtual cls" 
                           source-section="CLS" 
                           index-type="INDEX_BY_TOKEN" 
                           delimit-chars=";, " 
                           delete-chars=" " />

        <!-- Union Section Definitions -->
		<UnionSection name="TITLE" 
                         alias="title union" 
                         include-sections="TIK TIO" />

    <CreateTableSchema>

    <CreateTable table-name="blue01" with-schema="blue_table" alias="sample table1"/>
    <CreateTable table-name="blue02" with-schema="blue_table" alias="sample table2"/>
    <CreateTable table-name="blue03" with-schema="blue_table" alias="sample table3"/>

<DatabaseSchema>

<!-- End of KRISTAL Database Schema file -->

						

5.2.2 적재 스키마

대용량 데이터를 신속하게 데이터베이스로 적재 및 색인하기 위한 방법을 기술한 화일이다. 적재스키마는 데이터베이스 스키마처럼 XML문서로 작성되며, 적재문서 구조정의 부분과 적재 맵 구조 정의 부분으로 나뉜다

표 5.6. 적재 스키마 화일

부분기능엘리먼트비고
적재스키마정의 기본사항 정의

<LoaderSchema database-name="..." volume-dir="..." kristal-root="..." >

적재문서 구조정의

적재 맵 구조 정의

</LoaderSchema>

-
적재문서 구조정의문서구분자,섹션구분자 정의

<DocStructure name="..." border-string="...">

<Tag name="..." mapping-section="..."/>

....

<Tag name="..." mapping-section="..."/>

</DocStructure>

-
적재 맵 구조 정의적재할 파일리스트 및 관련 테이블 연결

<LoaderMap table="..." doc-structure="..." file="..." encoding="..." />

......

<LoaderMap table="..." doc-structure="..." file="..." encoding="..." />

-

5.2.2.1 적재 스키마 정의

<xml version="1.0" ?>
<LoaderSchema database-name="BLUE_DB" 
              volume-dir="/home/demo/DEMO/volume" 
              kristal-root="/home/demo/kristal">
    <--적재 문서 구조 정의-->
    <DocStructure ....>
    <DocStructure>

    <--적재 맵 구조 정의-->
    <LoaderMap .../>
    ....
    <LoaderMap .../>
<LoaderSchema>
					

database-name : 사용할 데이터베이스의 이름을 정의한다

volume-dir : 사용할 데이터베이스 볼륨의 물리적인 디렉토리 위치를 지정한다

kristal-root : KRISTAL 바이너리 패키지의 루트 디렉토리를 지정한다

5.2.2.2 적재문서 구조정의

<DocStructure name="struct01" border-string="@Yellow_View">
    <Tag name="#AN=" mapping-section="AN"/>
    <Tag name="#ANI=" mapping-section="ANI" do-skip="no"/>
....
    <Tag name="#URL=" mapping-section="URL"/>
<DocStructure>
					

데이터베이스에서 적재 대상으로 삼는 문서의 구조를 정의한다. DocStructure 엘리먼트의 name속성은 문서구조 스키마의 이름을 지정하고, border-string은 원시문서에서 각 문서를 구분하는 문서간 경계 구분자를 지정한다. Tag엘리먼트의 name속성은 섹션구분을 위한 태그를 지정하고, mapping-section은 매핑될 섹션이름을 지정한다. do-skip속성을 "yes"로 하면 지정된 태그는 저장되지 않고 건너 뛰게 되며, 디폴트 값은 "no"다.

5.2.2.3 적재 맵 구조정의

<LoaderMap table="blue01" doc-structure="struct01" 
      file="/home/demo/DEMO/data/*.dat" encoding="euc-kr" />
....
					

대상 문서와 대상 테이블을 매칭시킴으로써, 적재를 수행할 수 있도록 한다. table : 문서를 적재할 테이블을 지정한다 doc-structure : 사용할 문서 구조 정의를 지정한다 file : 적재 대상 문서 파일을 지정한다 encoding : 적재 대상 문서의 문서 인코딩 방식을 지정한다