開発者リファレンス : プログラミング方法の概要 : Zen Programmer’s Guide : データベースの作成
 
このページをシェアする                  
データベースの作成
Zen データベースは、以下の 2 つの部分から構成されています。
データを物理的に格納するデータ ファイル
データを記述するデータ辞書
以下のトピックでは、名前付きデータベースとバウンド データベースについて説明するほか、データベースの作成方法、およびデータ辞書を使用して、データ ファイルをテーブル、列、インデックスとして管理する方法について説明します。
名前付きデータベース
バウンド データベース
データベース コンポーネントの作成
名前付け規則
データ辞書の作成
テーブルの作成
列の作成
インデックスの作成
名前付きデータベース
名前付きデータベースには論理名があり、ユーザーはその論理名の実際の場所がわからなくても識別できます。データベースに名前を付ける際は、その名前を特定の辞書ディレクトリのパスおよび 1 つまたは複数のデータ ファイルのパスに関連付けるようにします。データベース名を使って Zen にログインするとき、Zen ではその名前を使って、データベース辞書とデータ ファイルを検索します。以下のことを行うには、データベースに名前を付ける必要があります。
トリガーの定義
主キーと外部キーの定義
データベースのバインド
データベースの整合性制約の停止
既存のアンバウンド データベースに名前を付けたり、新しいバウンド データベースを作成したりするには、Zen Control Center を使用します。詳細については、『Zen User's Guide』を参照してください。
バウンド データベース
データベースをバインドすると、データのアクセスに使用される方法とは無関係に、MicroKernel はデータベース セキュリティ、参照整合性(RI)、およびトリガーを設定できます。MicroKernel は、以下のようにこれらの整合性の制御を設定します。
バウンド データベースのセキュリティを定義した場合、Btrieve ユーザーはそのデータベースにアクセスできません。
アンバウンド データベースのセキュリティを定義した場合、Btrieve ユーザーはそのデータベースにアクセスできます。
バウンド データベースのセキュリティが定義されていない場合、Btrieve ユーザーは次の表に示すようにデータ ファイルにアクセスできます。
バウンド ファイルの制約
Btrieve を使用するアクセスのレベル
RI 制約の定義あり
ユーザーは、RI 制約内ですべてのものにアクセスして実行できます。
INSERT トリガーの定義あり
読み取り専用、更新および削除アクセス
UPDATE トリガーの定義あり
読み取り専用、挿入および削除アクセス
DELETE トリガーの定義あり
読み取り専用、挿入および更新アクセス
バウンド ファイルに複数の制約が存在する場合、アクセス レベルは制限される最大限の制約に従います。たとえば、ファイルに INSERT トリガーと UPDATE トリガーが定義されている場合は、読み取り専用および削除アクセスが行えます。
メモ:たとえデータベースをバインドしなくても、データ ファイルにトリガーがあるか、外部キーがあるか、あるいは外部キーで参照される主キーがある場合、Zen はデータ ファイルにバウンドというスタンプを自動的に付けます。したがって、データ ファイルはアンバウンド データベースの一部であっても、バインドされていることになります。そのような場合、MicroKernel はそのファイルがバウンド データベースの一部であるかのようにファイルに整合性制約を設定します。
バウンド データベース内の辞書ファイルとデータ ファイルは、ほかの名前付きデータベースでは参照できません。また、バウンド データ ファイルはデータベース内のほかのテーブルでは参照できません。
バウンド データベースを作成するか、既存のデータベースをバインドする場合、Zen はすべての辞書ファイルとデータ ファイルにバウンド データベースの名前を付けます。また、Zen はすべてのデータ ファイルにそのデータ ファイルに関連するテーブルの名前を付けます。また、データベースに新しいテーブルまたは辞書ファイルを追加すると、Zen はそれらを自動的にバインドします。
データベース コンポーネントの作成
データベースを作成するには、Zen Control Center を使用します。『Zen User's Guide』を参照してください。
データベースにテーブルを作成するには、Zen Control Center を使用するか、『SQL Engine Reference』で定義されている CREATE TABLE 構文を使用します。CREATE TABLE ステートメントを発行する場合は、列を定義するコマンドを取り込む必要があります。また、参照整合性(RI)制約を定義するコマンドを取り込むこともできます。
名前付け規則
データベースを作成する場合、Zen では各データベース コンポーネントに記述名を付けることができます。ユーザーとアプリケーションは、これらの名前でデータベースのコンポーネントを参照します。ここでは、データベース コンポーネントに名前を付けるときに従うべき規則について概説します。
詳細については、『Advanced Operations Guide』の識別子の種類別の制限を参照してください。
一意名
以下のデータベース コンポーネントは、辞書に一意名を持っていなければなりません。
テーブル
ビュー
インデックス
キー
ユーザー名
グループ名
ストアド プロシージャ
トリガー
1 つのテーブル内の列名
パラメーターと変数の名前は、SQL ステートメント内で一意でなければなりません。Zen キーワードは予約語であるため、データベース コンポーネントに名前を付けるためにそれらのキーワードを使用したり、パラメーター名や変数で使用することはできません。予約キーワードの一覧については、『SQL Engine Reference』の SQL の予約語を参照してください。
異なるテーブルで列名が重複している場合、関連するテーブル名またはエイリアス名を列名の前に置くことによって、各テーブル内に列名の修飾を行うことができます。たとえば、Student テーブルの ID 列を Student.ID として参照できます。これは、完全修飾された列名であり、テーブル名(Student)は列修飾子です。
有効な文字
以下に、SQL レベルでのデータベース コンポーネントの名前に対する有効な文字と、変数およびパラメーター名に対する有効な文字を示します。
a ~ z
A ~ Z
0 ~ 9
_(アンダスコア)
^(キャレット)
~(チルダ)
$(ドル記号)
メモ:データベース コンポーネントの名前の先頭は文字でなければなりません。データベース コンポーネントの名前、またはこれらの規則に従わないパラメーター名を指定する場合は、"name" のように二重引用符で囲んで名前を指定します。
名前の最大長
Zen では、辞書内のデータベース コンポーネント名の最大長に制限があります。『Advanced Operations Guide』の識別子の種類別の制限、および『SQL Engine Reference』の Zen 機能の制限/条件を参照してください。
大文字と小文字の区別
Zen は、データベース コンポーネント名を定義する場合に大文字と小文字を区別します。TaBLe1 という名前のテーブルを作成する場合、Zen はテーブル名を TaBLe1 として辞書に格納します。ユーザー名、ユーザー グループ名およびパスワードを例外として、Zen はコンポーネント名を定義した後に大文字と小文字を区別しません。テーブル TaBLe1 を定義した後、そのテーブルを table1 として参照できます。
ユーザー名、ユーザー グループ名およびパスワードは、Zen で大文字と小文字を区別します。たとえば、マスター ユーザーとしてログインする場合、ユーザー名を Master として指定する必要があります。
データを取得する場合、作成された状態に基づいて、Zen はテーブル、ビュー、エイリアスおよび列名を表示します。
SELECT *
FROM Course#
Zen は、以下のように列名を返します。
"Name", "Description", "Credit_Hours", "Dept_Name"
データ辞書の作成
Zen は、辞書を使用してデータベースに関する情報を格納します。辞書は、データベースのテーブルとビューを記述するいくつかのシステム テーブルから構成されています。
システム テーブルには、インデックス定義、例の特性、保全性とセキュリティ情報などの数種類のデータベース情報が含まれています。表 37 は Zen が作成するシステム テーブルを示しています。『SQL Engine Reference』のシステム テーブルも参照してください。
表 37 Zen システム テーブル
操作
結果テーブル
データ辞書の作成
X$File、X$Field、X$Index
列の属性の指定
X$Attrib
ストアド SQL プロシージャの作成
X$Proc
データベース セキュリティの定義
X$User、X$Rights
参照制約の定義
X$Relate
ビューの定義
X$View
トリガーの定義
X$Trigger、X$Depend
システム テーブルはデータベースの一部であるため、システム テーブルに照会してそれらの内容を決定できます。適切な権利があれば、システム テーブルを作成したり、それらの内容を変更することもできます。
メモ:Zen は、システム テーブル内のすべてのデータを表示するわけではありません。たとえば、ストアド ビューおよびストアド プロシージャの名前以外の情報は、Zen でしか使用できません。また、ユーザー パスワードなどのいくつかのデータは暗号化された文字で表示されます。
各システム テーブルの内容の完全なリファレンスは、『SQL Engine Reference』を参照してください。
辞書を作成すると、データベースにテーブル、列およびインデックスを追加できます。
名前付きデータベースを作成するには
メモ:参照整合性やトリガーなどのいくつかの機能を使用するには、名前付きデータベースが必要です。
1 新しい辞書テーブルを格納するためのディレクトリを作成します。
2 名前付きデータベースを追加するには、Zen Control Center を使用します。『Zen User's Guide』の新規データベースを作成するにはを参照してください。
名前なしデータベースの辞書を作成するには
1 DDF Builder を実行します。
2 データ辞書ファイル(DDF)の作成方法については、『DDF Builder User's Guide』の手順に従ってください。DDF Builder についてを参照してください。
テーブルの作成
テーブルを作成する場合は、テーブルに名前を付ける必要があります。各テーブル名は、データベース内で固有の名前である必要があります。テーブル名を付ける規則の詳細については、名前付け規則を参照してください。
どのテーブルをデータベースに作成するかを決定する場合は、さまざまなユーザーがビューを使用してさまざまな組み合わせでデータを見ることができるように考慮してください。ビューはテーブルに似ており、多くの目的、たとえば、データの取得、更新、削除などの目的でテーブルとして処理することができます。しかし、ビューは必ずしも 1 つのテーブルだけに関連付けられているわけではありません。ビューは、複数のテーブルから情報を組み合わせることができます。詳細については、データの取得を参照してください。
ZenCC を使用してテーブルを作成することができます。『Zen User's Guide』の新規テーブルのために Table Editor を起動するにはを参照してください。
エイリアス
以下のステートメント要素内のテーブル名にエイリアス(エイリアス名とも呼ぶ)を割り当てることができます。
SELECT または DELETE ステートメントの FROM 句
INSERT ステートメントの INTO 句
UPDATE ステートメント内のテーブルのリスト
メモ:エイリアスは、エイリアスを使用するステートメントにのみ適用されます。Zen はデータ辞書にエイリアスを格納しません。
エイリアスは、最大 20 文字の組み合わせとすることができます。テーブル名とエイリアス名は常に空白で区切ります。エイリアスと列名はピリオド(.)で区切ります。一度特定のテーブルのエイリアスを指定したら、ステートメント内であればどこでも、テーブルの列名の修飾に使用することができます。
以下の例では、Student テーブルにエイリアス名 s を、Enrolls テーブルに エイリアス名 e を指定しています。
SELECT s.ID, e.Grade
FROM Student s, Enrolls e
WHERE s.ID = e.Student_ID#
エイリアスを使用して以下のことが行えます。
長いテーブル名を置き換える。
対話形式で作業している場合、エイリアスを使用すると、特に列名を修飾しなければならないときにキーボード入力時間を節減できます。たとえば、以下のステートメントではエイリアスとして、Student テーブルには s、Enrolls テーブルには e、Class テーブルには c1 を割り当てています。この例では、エイリアスを使用して、選択リストと WHERE 条件の各列のソースを区別しています。
SELECT s.ID, e.Grade, c1.ID
FROM Student s, Enrolls e, Class c1
WHERE (s.ID = e.Student_ID) AND
      (e.Class_ID = c1.ID)#
ステートメントを読みやすくします。単一のテーブル名を持つステートメントでも、エイリアスはステートメントを読みやすくすることができます。
相関されたサブクエリ内の外側のクエリのテーブルを使用します。
SELECT s.ID, e.Grade, c1.ID
FROM Student s, Enrolls e, Class c1
WHERE (s.ID = e.Student_ID) AND
   (e.Class_ID = c1.ID) AND
   e.Grade >=
      (SELECT MAX (e2.Grade)
      FROM Enrolls e2
      WHERE e2.Class_ID = e.Class_ID)#
列の作成
CREATE TABLE ステートメントを使用してテーブルを作成する際に列を作成するか、ALTER TABLE ステートメントを使用して既存のテーブルに列を追加することができます。いずれの場合も、以下の特性を指定する必要があります。
列名-列を識別します。各列名は、テーブル内で一意の名前にする必要があり、また、20 文字を超えることはできません。Zen は、データベースの列名を定義する場合に大文字と小文字を区別しますが、列名を定義した後は大文字と小文字を区別しません。たとえば、ColuMN1 という列を作成する場合、名前は ColuMN1 として辞書に格納されます。それ以降は、column1 としてその名前を参照できます。列に名前を付ける規則の詳細については、名前付け規則を参照してください。
データ型-文字列や数字など、予想するデータの種類と、割り当てるディスク保存領域を識別します。
データ型の詳細については、『Btrieve API Guide』を参照してください。
インデックスの作成
インデックスは、特定の値を検索する操作、または特定の値によって並べ替える操作を最適化します。これらの操作のいずれかを頻繁に実行するすべての列に対し、インデックスを定義します。インデックスは、クエリの最適化において、特定の行または行のグループに対する高速の取得方法を提供します。Zen は、参照整合性(RI)付きのインデックスも使用します。インデックスは結合におけるパフォーマンスを向上し、クエリを最適化しやすくします。RI の詳細については、『Zen User's Guide』を参照してください。
Zen データベースでは、MicroKernel エンジンが定義する物理ファイルの一部としてインデックスを作成し、管理します。MicroKernel エンジン は、挿入、更新、または削除オペレーションのすべての管理を行います。これらのアクティビティは、すべての Zen アプリケーションに対して透過的です。
インデックスを作成するには、CREATE INDEX ステートメントを使用します。この方法では、名前付きインデックスを作成します。名前付きインデックスを作成した後、そのインデックスを削除できます。インデックスの削除の詳細については、データの挿入と削除を参照してください。
インデックスを使用して行をソートしたり個々の行を高速に取得できますが、データベースのディスク保存領域が増加し、挿入、更新、または削除オペレーションにおけるパフォーマンスが多少低下します。インデックスを定義するときは、これらの相殺条件を考慮してください。
次の例では、CREATE INDEX ステートメントを使用して、既に存在するテーブルにインデックスを追加します。
CREATE INDEX DeptHours ON Course
(Dept_Name, Credit_Hours)#
メモ:多数のデータを含むファイルで CREATE INDEX ステートメントを使用する場合は、実行が終了するまでにある程度の時間がかかり、その間はほかのユーザーがそのファイル内のデータにアクセスできないことに注意してください。
CREATE TABLE ステートメントと CREATE INDEX ステートメントの詳細については、『SQL Engine Reference』を参照してください。
インデックス セグメント
同じテーブル内の単一の列または列のグループ上にインデックスを作成できます。複数の列を含むインデックスをセグメント化されたインデックスと呼び、各列をインデックス セグメントと呼びます。
たとえば、Demodata サンプル データベースの Person テーブルには以下の 3 つのインデックスがあります。
Last Name 列と First Name 列から成るセグメント化されたインデックス
Perm_State + Perm_City 列
ID 列
インデックス セグメントの数は、データ ファイルのページ サイズの影響を受けます。PAGESIZE キーワードの使用方法の詳細については、『Btrieve API Guide』を参照してください。テーブルに対して作成できるインデックスの最大数は、データ ファイルのページ サイズと各インデックス内のセグメント数により異なります。次の表に示すように、ページ サイズが 4096 バイトより小さいデータ ファイルには、ページ サイズ 4096 のデータ ファイルと同じ個数のインデックス セグメントを収容できません。使用できるインデックス セグメントの数はファイルのページ サイズによって異なります。
 
ページ サイズ(バイト数)
キー セグメントの最大数(ファイル バージョン別)
8.x 以前
9.0
9.5
13.0
512
8
8
切り上げ2
切り上げ2
1024
23
23
97
切り上げ2
1536
24
24
切り上げ2
切り上げ2
2048
54
54
97
切り上げ2
2560
54
54
切り上げ2
切り上げ2
3072
54
54
切り上げ2
切り上げ2
3584
54
54
切り上げ2
切り上げ2
4096
119
119
2043
1833
8192
N/A1
119
4203
3783
16384
N/A1
N/A1
4203
3783
1 N/A は「適用外」を意味します。
2 「切り上げ」は、ページ サイズを、ファイル バージョンでサポートされる次のサイズへ切り上げることを意味します。たとえば、512 は 1024 に切り上げられ、2560 は 4096 に切り上げるということです。
3 9.5 以降の形式のファイルでは 119 以上のセグメントを指定できますが、インデックスの数は 119 に制限されます。
Status Codes and Messages』のステータス コード 26:指定されたキーの数が不正です。および 29:キー長が不正です。を参照してください。
ページ サイズと固定レコード長を使用して、データが格納されている効率性、たとえば、ページあたりの無駄に使用されているバイト数などを計算することができます。ページあたりのレコード数を少なくすることによって、ページレベル ロックでのロックが問題となる並行処理を改善することができます。
デフォルトでは、Zen はすべてのテーブルをページ サイズ 4096 バイトで作成します。ただし、CREATE TABLE ステートメントの PAGESIZE キーワードを使用して異なるページ サイズを指定したり、MicroKernel Database エンジンを使用してテーブルを作成し、そのテーブルに異なるページ サイズを指定することができます。
テーブルに対して定義されたインデックス セグメントの総数を計算する場合、セグメント化されていないインデックスは 1 つのインデックス セグメントとしてカウントされます。たとえば、テーブルに 3 つのインデックスが定義されていて、そのうちの 1 つに 2 つのセグメントがある場合、インデックス セグメントの総数は 4 です。
Zen Control Center を使用して、定義されたインデックス セグメント数とデータ ファイルのページ サイズを表示できます。このユーティリティの詳細については、『Zen User's Guide』を参照してください。
インデックス属性
インデックスを作成する場合は、インデックスに一連の特性、つまり、属性を割り当てることができます。インデックス属性は、インデックスの変更可能性と、テーブルに定義するインデックスを Zen がどのようにソートするかを決定します。インデックス定義を作成または変更するたびに、インデックス属性を指定するパラメーターを取り込むことができます。
インデックスは、以下の属性を持つことができます。
大文字と小文字の区別
Zen がソート中に大文字と小文字をどのように評価するかを決定します。デフォルトでは、Zen は大文字と小文字を区別するインデックスを作成します。大文字と小文字を区別するインデックスを作成するには、インデックスを作成するときに CASE キーワードを指定します。
ソート順
Zen がどのようにインデックス列の値をソートするかを決定します。デフォルトの設定で、Zen ではインデックス列の値を昇順(小さいものから大きなものへ)にソートします。降順にソートするインデックスを作成するには、インデックスを作成するときに DESC キーワードを指定します。
重複不可
Zen を使用して複数の行が同じインデックス列の値を持つことができるかどうかを決定します。デフォルトでは、Zen は一意でないインデックスを作成します。一意の値を必要とするインデックスを作成するには、インデックスを作成するときに UNIQUE キーワードを指定します。
変更可能性
Zen が対応する行をソートした後でインデックス列の値を変更できるかどうかを決定します。デフォルトでは、Zen が行を格納すると、Zen でインデックス列の値を変更できません。変更可能なインデックスを作成するには、インデックスを作成するときに MOD キーワードを指定します。
セグメント化
インデックスがセグメント化されるかどうか、つまり、1 つのインデックスに結合された列のグループからインデックスを構成するかどうかを指示します。デフォルトでは、Zen はセグメント化されないインデックスを作成します。CREATE TABLE ステートメントを使用してセグメント化されたインデックスを作成するには、インデックスの最後のセグメントを除き、作成する各インデックス セグメントに SEG キーワードを指定します(SEG キーワードは、指定された次の列が作成するインデックスのセグメントであることを指示します)。
CREATE INDEX コマンドでは一度に 1 つのインデックスだけしか作成できないため、SEG キーワードを使用してセグメント インデックスを指定する必要はありません。複数の列を指定する場合、Zen は列を指定する順に列を使用してセグメント化されたインデックスを作成します。
一部のみ
列とオーバーヘッドの合計サイズが 255 バイト以上のときに、Zen が CHAR 列または VARCHAR 列の一部を使用するかどうか、最後または唯一のインデックス列として設計するかどうかを示します。
デフォルトでは、Zen は部分インデックスを作成しません。CREATE INDEX ステートメントを使用して部分インデックスを作成するには、PARTIAL キーワードを指定します。
重複不可能性と変更可能性は、インデックス全体だけに適用されます。重複不可能性または変更可能性は、インデックス全体に適用しなければ、単一のインデックス セグメントに適用することはできません。たとえば、セグメント化されたインデックスを作成し、インデックス セグメントのうちの 1 つに MOD キーワードを指定する場合、すべてのセグメントに対して MOD キーワードを指定する必要があります。
それに対して、インデックス全体に影響を与えずに個々のインデックス セグメントに大文字と小文字の区別、ソート順序、セグメント化を適用できます。たとえば、大文字と小文字を区別するインデックスに大文字と小文字を区別しないインデックス セグメントを作成できます。
以下の条件を満たせば、部分インデックスはインデックス内に定義された最後の列にのみ適用されます。
その列がインデックスに定義された唯一の列である、または、インデックスに定義された最後の列であること
最後のインデックス列のデータ型が CHAR または VARCHAR であること
列のオーバーヘッドを含めたインデックスの合計サイズが 255 バイト以上であること
インデックスとその属性の詳細については、『SQL Engine Reference』の CREATE INDEX を参照してください。