前回の続きです。
現行のオブジェクト指向言語は木構造のデータ構造を持っていますが、
RDBMS(リレーショナル・データベース・メンテナンス・システム)のようなデータ構造をもつオブジェクト指向言語を
作ることはできるだろうか?そしてそれはどのようなものか?というのがテーマでした。
仮想言語でのコード例
データベースのテーブルをclass相当、レコードをインスタンス相当に見立てて仮想的な言語でコードを書くと以下のようになります。
/**
* テーブルの宣言
*/
public table HOGE {
// カラムの宣言
private String name;
private float alcVol;
private int price;
// コンストラクタ
public HOGE(String name, float alcVol, int price) {
this.name = name;
this.alcVol = alcVol;
this.price = price;
}
// staticなメソッド
public static void main(String[] args) {
// レコードのインスタンス作成
HOGE hoge = new HOGE("コアントロー", 40.0f, 1680);
// レコードに対する操作はstaticメソッド扱い
// レコードのINSERT
HOGE.INSERT(hoge);
// レコードのSELECT
// criteriaパターンでSELECTするのが妥当か?
HOGE[] hogeArray = HOGE.SELECT();
// 参照(ユニークキー相当)でのレコードの削除
HOGE.DELETE(hoge);
}
}
まず、カラムのデータ型に用いる型と区別するために宣言をtableキーワードで行っています。
カラムの宣言の部分はclassでのフィールド宣言と同等ですが、
ここではString型などを使っていますね。このように、カラムでは通常のオブジェクト指向言語での型を用いれるように考えています。
tableキーワードで宣言されたものはクラスの拡張のような扱いを考えています。
staticメソッドはjavaの起動用のmainメソッドを真似てみました。
レコードの生成はnewキーワードで行い、コンストラクタによって初期化されます。
テーブルに対するINSERT操作を行うことでレコードのINSERTを行えます。
ここでは簡素にするためにトランザクションについては考慮していません。
同様にSELECTやDELETEもテーブルについての捜査として行えるイメージです。
クラスのstaticなメソッドに相当しますね。
実際にはSELECTでは結合条件や検索条件が必要になると考えていますが、言語上の文法は妙案がありません。
selectによって得られるのはレコードの配列になります。
ユニークキーは参照そのものでよいのではないかと考えています。
外部からのデータへのアクセスをする際には一意に特定するためのIDが必要ですが、
言語内部で扱う分には参照と一体で構わないように思うのです。
テーブル間の結合
外部キーの制約のあるテーブルはそのまま参照を保持するイメージでよいと考えています。
public table T1 {
private T2 t2
not null;
}
public table T2 {
private int val;
}
単一の参照の場合は以上でよいように思うのですが、1対nの関係を持つ場合は扱いが面倒ですね。
public table T1 {
private T2 t2
relation t1;
}
public table T2 {
private T1 t2
not null;
private int val;
}
外部キーの制約をもつ場合はテーブル定義時点でなんらかの制約を記述することになるのかな、と考えています。
仮想言語の位置づけ
この仮想言語は議論のたたき台にするために、リレーション型のデータ構造を持てる言語を仮想的に考えたものです。
研究用に仮想的な言語を想定していますが、どのような形体が良いのか、手探りの段階です。
本サンプルではRDBMSをそのままJavaに融合させたような言語のイメージとなっていますが、
SELECTなどのテーブル操作がstaticメソッド扱いとしています。これが正しいのかがまず疑問。
形としては既存のオブジェクト指向言語の拡張でtableの定義もできるよ、という方向性にしてみました。
本当は参照実装を作れればよいのですが、言語を簡単に実装できるほどの腕を持ち合わせていないもので。
この仮想言語についての評価はまた改めて稿を起します。
投稿日時 : 2007年11月20日 0:49