凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46956
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

前回の続きです。

現行のオブジェクト指向言語は木構造のデータ構造を持っていますが、 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.0f1680);

    // レコードに対する操作は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
コメント
  • # re: リレーション型オブジェクト指向の試案
    れい
    Posted @ 2007/11/20 12:28
    RDBMSをjavaで実装したものと何が違うのでしょうか?
    既存のRDBMSからテーブル構造を読み込む時にはどうするのでしょう?
    tableがclass相当だと、同じ構造のtableを作るには同じ内容を2回記述することになりますがOKですか?

    > 現行のオブジェクト指向言語は木構造のデータ構造を持っていますが
    そもそもこれは間違ってると思いますが。
  • # re: リレーション型オブジェクト指向の試案
    かずくん
    Posted @ 2007/11/20 13:50
    これって、J2ee entity beanやADO.net Entity Frameworkみたいなものへのアプローチと思えばよいのでしょうか?
  • # re: リレーション型オブジェクト指向の試案
    凪瀬
    Posted @ 2007/11/20 13:50
    ここから、隠蔽と継承と多態が加わってくるんですよ。
    RDBMSのレコードに対してオブジェクト指向の要素が加わったときに
    どのようなプログラミングが可能になるのか?
    ということで、そちらの稿も準備しているところです。

    同等の構造のテーブルの場合は~というのは確かにあり、
    Javaで同等の構造のclassを作るには同じ内容を2回記述することになるのと同じ問題と思っています。
    ClassLoaderを替えるとかすれば可能なのですが、一般的にはできないことの一つですね。

    既存RDBMSとの連携はいまのところ考えていません。
    実務上は連携部分が必要になるとは思いますが、
    現時点では考察の対象外としています。
    たぶん、なんらかのバインド機能を持たせることになるのではないかと思いますが。


    >>現行のオブジェクト指向言語は木構造のデータ構造を持っていますが
    >そもそもこれは間違ってると思いますが。

    現行のオブジェクト指向「言語」でそのまますんなりリレーション型の
    データ構造を表現してみてもらえますでしょうか?
    私にはできませんので後学のためにぜひ。

    言語仕様としてフィールドに他のオブジェクトへの参照を持つことができますが
    この構造は木構造のデータ構造ですよね?
    いや、網構造にもできますし、環状にすることも可能ですが
    基本的に木構造のデータ構造に隠蔽と継承と多態を加えている。

    だからこそ、GUIだとかポリゴンだとか、木構造をもつデータとはすこぶる相性がよく、
    RDBMSとは相性が悪く、特にインピーダンスミスマッチという言葉まで生まれている。

    じゃぁ、リレーショナルデータベースのレコードを基準に隠蔽と継承と多態をもたせたら?
    というのが先の稿の図なわけです。
  • # re: リレーション型オブジェクト指向の試案
    かずくん
    Posted @ 2007/11/20 13:55
    どちらかといえば、ADO.netのDataSetへのアプローチかな?
    モデルはPoEAAのTable Module?
  • # re: リレーション型オブジェクト指向の試案
    凪瀬
    Posted @ 2007/11/20 13:56
    > J2ee entity bean
    EJBのことでいいのかな?

    プログラミング言語として、リレーション構造のデータを扱えるようにするとどうなるか、
    リレーション構造のデータで隠蔽と継承と多態を行うとどうなるか
    という方向性の研究になります。

    EJBとは方向性が違うと思っています。
    私は詳しくないのですがLINQが比較的近いのかもしれません。
    ただし、LINQはリレーション構造のデータを扱えるがそのデータに隠蔽と継承と多態を
    持たせていない点で違います。

    オブジェクト指向言語の中でリレーション構造のデータを扱うのではなく
    リレーション構造を持つオブジェクト指向言語を構想するという話題になっています。
  • # re: リレーション型オブジェクト指向の試案
    凪瀬
    Posted @ 2007/11/20 14:00
    > どちらかといえば、ADO.netのDataSetへのアプローチかな?
    > モデルはPoEAAのTable Module?

    私はPoEAAというものについて無知ですし、
    簡単に調べても実態がつかめなかったのでちょっとコメントできません。

    申し訳ありませんがADO.netについても同様で、類似性と相違についてコメントできません。
  • # re: リレーション型オブジェクト指向の試案
    れい
    Posted @ 2007/11/20 14:30
    > ここから、隠蔽と継承と多態が加わってくるんですよ。
    実は楽しくて楽しみでしょうがないのです。
    途中までの情報でアレコレ言うのは良くないのかな?
    ツッコミは最後に、というのであれば言ってください。

    > 言語仕様としてフィールドに他のオブジェクトへの参照を持つことができますが
    > この構造は木構造のデータ構造ですよね?
    違いますよ。
    参照は有向リンクです。
    だからグラフ構造で、その一形態がTreeです。
    継承の関係もグラフ構造の一形態です。

    > 現行のオブジェクト指向「言語」でそのまますんなりリレーション型の
    > データ構造を表現してみてもらえますでしょうか?
    RDBMSを素直に一般化すればADO.Netとほぼ変わらぬものになると思います。

    ストレージングと速度が問題で、
    それさえ解決されればRDBMSなんて要らないのですがね。
  • # re: リレーション型オブジェクト指向の試案
    凪瀬
    Posted @ 2007/11/20 15:33
    >> 言語仕様としてフィールドに他のオブジェクトへの参照を持つことができますが
    >> この構造は木構造のデータ構造ですよね?
    >違いますよ。
    >参照は有向リンクです。
    >だからグラフ構造で、その一形態がTreeです。
    >継承の関係もグラフ構造の一形態です。

    なるほど。
    もっと上位のうまく説明しうる概念が存在するのですね。
    これは本格的にグラフ理論を紐解いて見ないといけませんね。

    しかし、例えばJavaでリレーション構造の表現がうまく行えないのは
    その「有向リンク」ではないということなのでしょうか?
    掘り下げるといろいろと見えてきそうですね。

    >> 現行のオブジェクト指向「言語」でそのまますんなりリレーション型の
    >> データ構造を表現してみてもらえますでしょうか?
    >RDBMSを素直に一般化すればADO.Netとほぼ変わらぬものになると思います。

    かずくんへの返答でも書いていますがADO.Netについて無知なもので…。
    これも一段掘り下げて調べて見たいと思います。

    > 途中までの情報でアレコレ言うのは良くないのかな?
    > ツッコミは最後に、というのであれば言ってください。
    いえ、指摘があれば遠慮なくお願いします。
    「過ちて改めず、これを過ちという」の精神でやっておりますので。

    自分の無知を補完していただけるような指摘は非常に有難いと思っています。
  • # re: リレーション型オブジェクト指向の試案
    れい
    Posted @ 2007/11/20 17:34
    > しかし、例えばJavaでリレーション構造の表現がうまく行えないのは
    > その「有向リンク」ではないということなのでしょうか?

    いいえ。有向リンクです。

    データ構造が違うものを移すのは「常に」大変なのです。
    ましてそれが「メタデータ」を含むものだと。

    ただ、オブジェクト指向言語からRDBMSを扱うことの「頻度」が高いので、みんなに「相性が悪い」と問題視されてるだけです。

    オブジェクト指向言語では全ての有限なグラフが扱えます。
    が、もしグラフ内を検索するなら、検索アルゴリズムを自分で作らないといけません。

    一方RDBMSは構造を「表」と「関係」に限定し、専用のコードで、すばやい検索と効率的なストレージを実現しています。

    どのように歩みよったら良いのか、それともRDBMSを棄却してオブジェクトなDBを導入するべきか、それが問題です。

    私は原理主義者なので、RDBMSを捨てたいのですが、DBを組み込んだオブジェクト指向言語も無く、オブジェクトなDBもまともに使えない現状です。
  • # re: リレーション型オブジェクト指向の試案
    凪瀬
    Posted @ 2007/11/20 20:08
    数学的な話になるとチューリングマシンを満足していれば全ての有向リンクを扱えることになるのでしょうか。

    確かに現行オブジェクト指向言語でRDBMSを作ることが可能であることから考えれば、
    現行オブジェクト指向言語でリレーション型のデータを表現できるということにはなりますね。

    問題は「うまく扱えるか?」という部分なのだけど、この「うまく」ってのが
    数学的なモデルでの何に相当するのかが良く分からないところですね。
    相性の良し悪しが何らかのパラメータで表現できると客観的な評価がしやすいのでしょうけども。
  • # re: リレーション型オブジェクト指向の試案
    れい
    Posted @ 2007/11/20 21:13
    > 数学的な話になるとチューリングマシンを満足していれば全ての有向リンクを扱えることになるのでしょうか。

    関係ありません。
    グラフは情報の表現方法(保存方法)であって、
    プロセッシングとは直接は関係ありません。
    「アルゴリズムとデータ構造」を軽く勉強していただければ。

    > 問題は「うまく扱えるか?」という部分なのだけど、この「うまく」ってのが
    > 数学的なモデルでの何に相当するのかが良く分からないところですね。

    それが他と比較してどのくらいめんどくさいのかという
    客観的指標は思いつきません。
    統計でもとればわかりますが…。
    グラフの変形はグラフ理論の基礎にありましたが、
    関係なさそうです。

    RDBMSからデータの移動だけならそんなに大変ではないと思います。
    「メタデータ」も移したいと思うとめんどくさくなります。
    メタデータを他の表現からオブジェクト指向言語に移動する場合、
    どんなものであってもめんどくさいと思います。
    XMLであれRDBMSであれファイルであれ。

    私見ですが、規模が同じであれば同じ手間に感じます。
    ただ、RDBMSの規模は大きいものが多いので…。
    だからO/Rマッピングが必要になるのでしょう。
  • # re: リレーション型オブジェクト指向の試案
    凪瀬
    Posted @ 2007/11/20 21:32
    > 「アルゴリズムとデータ構造」を軽く勉強していただければ。

    うーん。わからない。
    「アルゴリズムとデータ構造」を軽く勉強してわかるなら今の自分には理解できる基礎があるはずなのですが。

    リレーションの構造を例えばJavaに簡単に乗せられるかといえば違う。
    簡単じゃくても乗るでしょう?という意味ならそのとおりでしょうけども。

    「データ構造が違うものを移すのは「常に」大変なのです。」というくだりからすると
    変換して乗せることを前提に話をされているのかな?
    私が変換しないでのせることを考えているから話が合わないのでしょうか。


    チューリングマシンを引き合いに出したのは、計算可能性のような話をしているのかな?と
    感じたからですが、そういう意味になると議論がまた違う方向に向いてしまいますね。


    > 「メタデータ」も移したいと思うとめんどくさくなります。

    ここで言うメタデータというのはテーブル側が保持している属性を意味しています?
    ちょっとイメージが掴みにくくて。
  • # リレーション型オブジェクト指向の試案 その2
    凪瀬 Blog
    Posted @ 2007/11/20 22:06
    リレーション型オブジェクト指向の試案 その2
  • # re: DBわからん、やっぱわからん
    東方算程譚
    Posted @ 2008/04/08 15:59
    re: DBわからん、やっぱわからん
  • # RDBMSにオブジェクト指向を導入できるのか?
    凪瀬 Blog
    Posted @ 2008/04/08 16:19
    RDBMSにオブジェクト指向を導入できるのか?
  • # radio znline
    bogemi
    Posted @ 2011/08/24 16:55

    http://www.buysale.ro/anunturi/casa-si-gradina/instalatii-sanitare-si-accesorii/buzau.html - buzau
  • # cqFZxjvxVSkayxChbi
    http://oemfinder.com
    Posted @ 2011/09/29 5:19
    aHfr1W Thanks:) Cool topic, write more often! You manage with it perfctly:D
  • # VooykegoTZpnyl
    http://www.epotenzmittel.com/
    Posted @ 2011/10/21 22:05
    Are you interested in webmaster`s income?!...
  • # nZxecDmDANYkpTVo
    http://www.pharmaciecambier.com/
    Posted @ 2011/11/02 5:26
    I serched through the internet and got here. What a wonderful invention of the mankind. With the help of the network you communicate, learn, read !... That helped us to get acquainted!...
  • # tIJdEXibmbEcWEmc
    http://optclinic.com/
    Posted @ 2011/11/02 6:21
    Yeah, now it's clear !... And firstly I did not understand very much where there was the link with the title itself !!...
  • # DmDljtvtUlSOxzJmG
    http://www.buyplavixonline.net
    Posted @ 2011/11/08 19:22
    Thanks for the article! I hope the author does not mind if I use it for my course work!...
  • # ILZySTSEKOGMo
    http://www.farmaciaunica.com/
    Posted @ 2011/11/09 6:41
    Yeah, it is clear now !... From the very beginning I did not understand where was the connection with the title !!...
  • # oOUJkyOwCQOdeBLDbuw
    http://circalighting.com/details.aspx?pid=932
    Posted @ 2011/11/16 2:57
    Hi! Everyone who reads this blog - Happy Reconciliation and Accord..!
  • # mFfRXhCQXkFw
    http://catalinabiosolutions.com/index.php/oil-clea
    Posted @ 2011/11/16 3:37
    Pleased to read intelligent thoughts in Russian. I`ve been living in England for already 5 years!...
タイトル
名前
Url
コメント