データベースの作成
Zen データベースは、以下の 2 つの部分から構成されています。
•
•
以下のトピックでは、名前付きデータベースとバウンド データベースについて説明するほか、データベースの作成方法、およびデータ辞書を使用して、データ ファイルをテーブル、列、インデックスとして管理する方法について説明します。
•
•
•
•
•
•
•
•
名前付きデータベース
名前付きデータベースには論理名があり、ユーザーはその論理名の実際の場所がわからなくても識別できます。データベースに名前を付ける際は、その名前を特定の辞書ディレクトリのパスおよび 1 つまたは複数のデータ ファイルのパスに関連付けるようにします。データベース名を使って Zen にログインするとき、Zen ではその名前を使って、データベース辞書とデータ ファイルを検索します。以下のことを行うには、データベースに名前を付ける必要があります。
•
•
•
•
既存のアンバウンド データベースに名前を付けたり、新しいバウンド データベースを作成したりするには、Zen Control Center を使用します。詳細については、『Zen User's Guide』を参照してください。
バウンド データベース
データベースをバインドすると、データのアクセスに使用される方法とは無関係に、MicroKernel はデータベース セキュリティ、参照整合性(RI)、およびトリガーを設定できます。MicroKernel は、以下のようにこれらの整合性の制御を設定します。
•
バウンド データベースのセキュリティを定義した場合、Btrieve ユーザーはそのデータベースにアクセスできません。
•
アンバウンド データベースのセキュリティを定義した場合、Btrieve ユーザーはそのデータベースにアクセスできます。
•
バウンド データベースのセキュリティが定義されていない場合、Btrieve ユーザーは次の表に示すようにデータ ファイルにアクセスできます。
バウンド ファイルに複数の制約が存在する場合、アクセス レベルは制限される最大限の制約に従います。たとえば、ファイルに 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』の「識別子の種類別の制限」を参照してください。
一意名
以下のデータベース コンポーネントは、辞書に一意名を持っていなければなりません。
•
•
•
•
•
•
•
•
•
パラメーターと変数の名前は、SQL ステートメント内で一意でなければなりません。Zen キーワードは予約語であるため、データベース コンポーネントに名前を付けるためにそれらのキーワードを使用したり、パラメーター名や変数で使用することはできません。予約キーワードの一覧については、『SQL Engine Reference』の SQL の予約語を参照してください。
異なるテーブルで列名が重複している場合、関連するテーブル名またはエイリアス名を列名の前に置くことによって、各テーブル内に列名の修飾を行うことができます。たとえば、Student テーブルの ID 列を Student.ID として参照できます。これは、完全修飾された列名であり、テーブル名(Student)は列修飾子です。
有効な文字
以下に、SQL レベルでのデータベース コンポーネントの名前に対する有効な文字と、変数およびパラメーター名に対する有効な文字を示します。
•
•
•
•
•
•
•
メモ:データベース コンポーネントの名前の先頭は文字でなければなりません。データベース コンポーネントの名前、またはこれらの規則に従わないパラメーター名を指定する場合は、"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 は、辞書を使用してデータベースに関する情報を格納します。辞書は、データベースのテーブルとビューを記述するいくつかのシステム テーブルから構成されています。
システム テーブルには、インデックス定義、例の特性、保全性とセキュリティ情報などの数種類のデータベース情報が含まれています。表 36 は Zen が作成するシステム テーブルを示しています。『SQL Engine Reference』のシステム テーブルも参照してください。
システム テーブルはデータベースの一部であるため、システム テーブルに照会してそれらの内容を決定できます。適切な権利があれば、システム テーブルを作成したり、それらの内容を変更することもできます。
メモ:Zen は、システム テーブル内のすべてのデータを表示するわけではありません。たとえば、ストアド ビューおよびストアド プロシージャの名前以外の情報は、Zen でしか使用できません。また、ユーザー パスワードなどのいくつかのデータは暗号化された文字で表示されます。
各システム テーブルの内容の完全なリファレンスは、『SQL Engine Reference』を参照してください。
辞書を作成すると、データベースにテーブル、列およびインデックスを追加できます。
►
メモ:参照整合性やトリガーなどのいくつかの機能を使用するには、名前付きデータベースが必要です。
1
2
►
1
2
データ辞書ファイル(DDF)の作成方法については、『DDF Builder User's Guide』の手順に従ってください。「DDF Builder について」を参照してください。
テーブルの作成
テーブルを作成する場合は、テーブルに名前を付ける必要があります。各テーブル名は、データベース内で固有の名前である必要があります。テーブル名を付ける規則の詳細については、名前付け規則を参照してください。
どのテーブルをデータベースに作成するかを決定する場合は、さまざまなユーザーがビューを使用してさまざまな組み合わせでデータを見ることができるように考慮してください。ビューはテーブルに似ており、多くの目的、たとえば、データの取得、更新、削除などの目的でテーブルとして処理することができます。しかし、ビューは必ずしも 1 つのテーブルだけに関連付けられているわけではありません。ビューは、複数のテーブルから情報を組み合わせることができます。詳細については、データの取得を参照してください。
ZenCC を使用してテーブルを作成することができます。『Zen User's Guide』の「新規テーブルのために Table Editor を起動するには」を参照してください。
エイリアス
以下のステートメント要素内のテーブル名にエイリアス(エイリアス名とも呼ぶ)を割り当てることができます。
•
•
•
メモ:エイリアスは、エイリアスを使用するステートメントにのみ適用されます。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 つのインデックスがあります。
•
•
•
インデックス セグメントの数は、データ ファイルのページ サイズの影響を受けます。PAGESIZE キーワードの使用方法の詳細については、『Btrieve API Guide』を参照してください。テーブルに対して作成できるインデックスの最大数は、データ ファイルのページ サイズと各インデックス内のセグメント数により異なります。次の表に示すように、ページ サイズが 4096 バイトより小さいデータ ファイルには、ページ サイズ 4096 のデータ ファイルと同じ個数のインデックス セグメントを収容できません。使用できるインデックス セグメントの数はファイルのページ サイズによって異なります。
 
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 がどのようにソートするかを決定します。インデックス定義を作成または変更するたびに、インデックス属性を指定するパラメーターを取り込むことができます。
インデックスは、以下の属性を持つことができます。
重複不可能性と変更可能性は、インデックス全体だけに適用されます。重複不可能性または変更可能性は、インデックス全体に適用しなければ、単一のインデックス セグメントに適用することはできません。たとえば、セグメント化されたインデックスを作成し、インデックス セグメントのうちの 1 つに MOD キーワードを指定する場合、すべてのセグメントに対して MOD キーワードを指定する必要があります。
それに対して、インデックス全体に影響を与えずに個々のインデックス セグメントに大文字と小文字の区別、ソート順序、セグメント化を適用できます。たとえば、大文字と小文字を区別するインデックスに大文字と小文字を区別しないインデックス セグメントを作成できます。
以下の条件を満たせば、部分インデックスはインデックス内に定義された最後の列にのみ適用されます。
•
•
•
インデックスとその属性の詳細については、『SQL Engine Reference』の 「CREATE INDEX」 を参照してください。