はじめに
Cachéは、リレーショナルデータベースシステムではありませんが、Caché SQLを使用することにより、一般的なリレーショナルデータベースシステムと同じようにSQL文でデータベースにアクセスが可能です。さらにリレーショナルデータベースシステムにアクセスするための標準規格であるODBC、JDBCをサポートしていますので、これらの規格に則ったさまざまな製品、フレームワーク、ミドルウェア、開発環境との連携が可能です。
Caché SQLの機能概要
統一データアーキテクチャ
「Caché SQL」は、Cachéのコアアーキテクチャである統一データアーキテクチャの1つのコンポーネントとして提供される機能です。Cachéのメタデータ定義(スキーマ)は、クラス定義と呼ばれますが、これは、オブジェクト指向の考え方に則った形で、オブジェクトの雛形を定義するもので、一般的なオブジェクト指向言語でクラスを定義することとほぼ同等です。それらとの大きな違いは、Cachéのクラスでは、そのクラス定義の属性として永続性を持たせることができる点で、これがCachéがデータベースとなりえる所以となります。
1つのクラス定義は、他クラスへの参照、リレーションシップ、コレクションなどの関連を持つことができ、結果として、複雑なオブジェクトツリー構造を表現できます。これらの構造は、最終的には、下位の多次元データエンジンを通して、多次元配列データとして、Cachéデータベースに格納、参照されます。
そして、その構造の各層をスライスすることにより、複数の2次元のテーブルとして表現可能になります。
従って、1つのクラス定義(およびそれに関連するクラス定義)から構造の複雑さに応じて、複数(1-n)のテーブル定義が生成されて、各テーブル定義に対してSQLでのアクセスが可能になります(統一データアーキテクチャについては、連載第1回で解説)。
クラス定義の方法
クラス定義は、Cachéクラス定義言語に基づいて定義する方法と、SQL標準で定義されているDDL言語を使って定義する2種類の方法が用意されています。
いずれの方法を使っても、統一データアーキテクチャを通して、クラス定義とテーブル定義の2つが自動生成されるようになっています。またDDL言語は、各ベンダー固有のシンタックスもサポートしており、例えばOracleで定義されたDDL文をCachéにインポートして、クラス定義、テーブル定義を生成することも可能です。
SQLアクセス方法
SQLを使ってCachéのデータベースにアクセスする方法には、以下の方法があります。
- 管理ポータルのデータ管理SQLから直接SQL文を実行する
- Caché ObjectScriptのプログラムの中に埋め込みSQL文として記述し、実行する
- Caché ObjectScriptまたは、Caché Basicのプログラムの中で、
ResultSet
オブジェクトを生成し、そのコマンドとして動的SQL文を実行 - ODBCに対応したツールからSQL文を発行する
- Javaのプログラムの中で、JDBCを使用してSQL文を発行する
その他
インデックス
Cachéでも、他のリレーショナルデータベースシステムと同様にクエリのスピードを向上するためにインデックスを利用できます。 インデックスの種類として、一般的なインデックスのほかに複雑な検索条件の実行の高速化に寄与するビットマップインデックス、集計の高速化を実現できるビットスライスインデックスが用意されています。
全文検索機能
文字列の検索に関して、一般的な完全一致や前方一致だけでなく、中間一致も高速に検索可能な全文検索機能も用意されています。
トリガー
一般的なリレーショナルデータベースシステムと同様にトリガーを定義することができます。
ストアドプロシジャ
連続するSQL文を実行したり、複雑な処理をひとまとめにしてストアドプロシジャとして登録し、ODBC、JDBC等から実行し、結果を返すことが可能です。
ビュー
一般的なリレーショナルデータベースシステムと同様にビューを定義することができます。
セキュリティ
ユーザー単位、またはその上位概念であるロール単位にテーブルアクセスの制御が可能です。
また、行単位セキュリティという機能があり、行単位にセキュリティ設定が可能です。
ストリームデータ(バイナリデータ、長い文字列データ)対応
いわゆるBLOBやCLOBと呼ばれるデータをSQLからアクセスすることが可能です。
拡張機能
Caché SQLには、一般的なリレーショナルデータベースにはないユニークな機能拡張があります。
暗黙JOIN
明示的にJOINを指定して複雑なSQL文を記述する代わりに、特別な->
演算子を使って関連テーブルからの値を取得する簡便な方法を提供します。
前方一致演算子
文字列の前方一致検索を行う拡張演算子%STARTSWITH
が用意されています。この演算子を使用すると、インデックスを利用した高速検索を行うことができます。
ユーザー定義関数
Cachéのクラスメソッド(静的メソッド)をSQL文からユーザー定義関数として実行することができます。
操作方法
システム管理ポータルを使ったサンプルデータベースに対してSQL文を発行
まず、システム管理ポータルを起動します。
Cachéキューブをクリックし、メニューからシステム管理ポータルを選択すると、ブラウザが起動します。
データ管理のSQLをクリックし、左側のネームスペースからSAMPLESを選択します。
SQL操作からSQL文の実行をクリックします。
SQLクエリ:のテキストボックスに以下のSQL文を入力します。
select * from sample.person
クエリ実行ボタンをクリックすると、次のように結果が表示されます。
暗黙参照を使ったクエリの発行
SQLクエリ:のテキストボックスに以下のSQL文を入力します。
select spouse->name from sample.person where spouse is not null
クエリ実行ボタンをクリックすると、次のように結果が表示されます。
SQLクエリ:のテキストボックスに以下のSQL文を入力します。
select p2.name from sample.person p1, sample.person p2 where p1.spouse is not null and p1.spouse = p2.%id order by p1.%id
クエリ実行ボタンをクリックすると、次のように結果が表示されます。
以前の結果と同じ結果が返ってくると思います。
この2つのSQL文は、意味的には同じ要求を実行します。
しかし、暗黙参照を使用すると、通常のテーブル結合を使用するのに比べて、SQL文をすっきり記述でき、直感的に分かりやすくなります。
ODBCを使ったSQL文の実行
ODBCをサポートしているツールであれば、Cachéに対してSQL文を使ってODBC経由で操作可能です。
ここでは、フリーウェアのCSEというツールを使ってCachéにSQL文でアクセスします。CSEは、「つみきウェブ」からダウンロードできます。ZIPファイルを適当なディレクトリで解凍後、「cse.exe」を実行します。
[データベース]メニューから接続を選択し、
DBMSで「ODBC汎用」、データソースで「CACHE Samples」を選択し、[OK]ボタンを押します。
そうすると、コンソールウィンドウに次のようなメッセージが表示されます。
InterSystems Cache version Cache Objects Version 2007.1.3.607 Cach[&:eacute;] xDBC Server 6.10に接続されました。
上のコマンドウインドウに以下のSQL文を入力します。
select * from sample.person
そして、[データベース]メニューから[実行]を選択するか、一番下のツールバーからえんじ色の!マークをクリックします。
そうすると、コンソールに検索結果が次のように返ってきます。
JDBCを使ったSQL文の実行
Cachéをインストールすると、自動的にJavaを使ったJDBCのサンプルアプリケーションもインストールされます。そのサンプルの1つを動作させて、JDBCでのアクセスが可能であることを確認しましょう。
標準インストールを行なった場合、以下のディレクトリに「JDBCQuery.java」というファイルがあります。
c:\InterSystems\Cache\Dev\java\samples
このjavaプログラムをeclipseなどのJava IDE上でコンパイルし、実行してみます。
その際に、CLASSPATHに次のようにCachéのライブラリjarファイルの場所を指定します。
次のようにコンソールから、batファイルとして以下の内容を含むものを作成し、直接実行することも可能です。
Set CLASSPATH=%CLASSPATH%;.;C:\InterSystems\Cache\dev\java\lib \JDK15\CacheDB.jar javac JDBCQuery.java java JDBCQuery
終わりに
通常、オブジェクト指向的な考え方とリレーショナル的な考え方は、相容れないものと考えられており、一般的にはこれを「O/Rミスマッチ」と呼びます。このO/Rミスマッチを解消するためには、双方を結びつけるためのマッピングが必要と考えられていますが、双方のマッピングを維持管理していくことは、定義が増えるにつれ困難になっていきます。
Cachéは、言わば、このマッピングをシステムとして自動的に維持管理していってくれるわけで、人的な管理がまったく必要ありません。先進のオブジェクト指向フレームワークを実装しながら、Cachéが普通のリレーショナルデータベースシステムと何ら変わりなく、SQL文を使ってアクセスできることを理解いただければ幸いです。