[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[kahua-dev:00655] Re: オブジェクトデータベース



From: 久住憲嗣 <nel@xxxxxxxxxxxx>
Subject: [kahua-dev:00652] オブジェクトデータベース
Date: Thu, 13 May 2004 09:43:50 +0900

> オブジェクトデータベースについて2つ質問です.
> 
> 1. persistent objectを削除する方法はあるのでしょうか.
> 必要無くなったpersistent objectは消してしまいたいです.

(まだ)無いです。
セマンティクスをどうしようかなと思案中。難しいのは、永続オブジェクト間で
リンクを張っている場合の処理です。

AllegroStoreではdelete-instanceメソッドにより永続オブジェクトが消せます。
AllegroStoreでは、永続オブジェクト間のリンクは内部で常に逆リンクを対にして
管理するようになっているので、消された永続オブジェクトを指しているポインタは
nilへと置き換えられます。「永続オブジェクトへのポインタの集合」という特別な
型もあて、そういう型が使われている場合は単に消された永続オブジェクトへの
ポインタが集合から除かれるだけです。

ただ、本当にそれでいいのかって疑問はあります。オブジェクトを消すことによって
知らないうちに別のオブジェクトのスロットがnilになるってのも気持ち悪いですし、
ポインタの集合みたいな型を導入するのもあんまり綺麗じゃないなって感じも
します。いや、実用上、消したい時があるのは確かなんですけども。

persistent objectをデータベースのような別個のリソースとしてではなく、
普通のオンメモリのオブジェクトの延長として考えた場合、Schemeのセマンティクス
では、「オブジェクトの消去」という明示的な操作は無いですよね。理念的には、
全てのオブジェクトは一度作られたら永久に残ります(無限エクステント)。

但し、そのオブジェクトにどうやってもアクセスできないという状態になったことが
証明される限りにおいては、GCがオブジェクトの使ってたメモリを開放して再利用
することが許されています。そうやっても動作に影響を与えないから。

そういう観点でpersistent objectを見ると、どのオブジェクトもキーで
インデックスされてしまうので、永遠に到達可能であり、従ってGCされずに
残るべきである、ってことになります。

理屈の上で綺麗なのは、必要無くなった永続オブジェクトを「キーによる検索から
外す」という操作を追加することでしょうか。その時点でもしその永続オブジェクトが
他の永続オブジェクトから参照されていなければ、それはごみとして回収されますし、
他の永続オブジェクトからの参照が残っていればそれらが消えるまで回収はされない、
って感じになると思います。ただ、なかなかそれをうまく実装するのも面倒。

ストレージの限界が気にしなくて良い程大きくて、かつ検索速度が
データベースのトータルサイズに影響されない(アクティブなデータのサイズ
のみに影響される)なら、削除なんて一切考えない、ってのもありだと思うん
ですけどね。

> 2. 親:<kahua-persistent-base> -> 子:<hoge> -> 孫1:<fuge>
>                                             -> 孫2: <fuge2>
> のような関係のクラスを定義して, 孫の<fuge>/<fuge2>のインスタンスを
> それぞれいくつかmakeしておいたときに, <fuge>/<fuge2>のすべての
> インスタンスの集合を取得する方法はあるのでしょうか.
> (make-kahua-collection <hoge>)では, <hoge>の直接のインスタンスの
> 集合のみ取得できるようです.

あ、この機能はつけようと思ってまだつけてなかった。
make-kahua-collectionにキーワード引数で何か指定したら
サブクラスも検索するようにするつもりでした。
うーん、ちょっといじればできそうだなあ。

> # おまけ
> # 3. オブジェクトデータベースを別ライブラリにする予定はありますか?
> # ほかでも使いたいなぁと思いまして...

色々実験してみて、良いAPIとセマンティクスが見えてからGauche本体に
取り込もうかと思ってました。
SchemerはEager Evaluation and Lazy Standardizationなんです。

kahuaのライブラリだけでもインストールすることが可能なのであれば、
kahua.persistenceモジュールは他のkahuaモジュールには一切依存して
いないので、利用者側で (use kahua.persistence) してもらえれば
独立した利用は可能です。
あるいはkahua/persistence.scmだけ抜き出して使ってもらっても。

--shiro