无寿鈴さんとモバ友になろう!
日記・サークル・友達・楽しみいっぱい!
-
- 2010/10/17 2:01
- オブジェクトデータベースエンジン
-
- コメント(2)
- 閲覧(46)
-
-
- だいぶ前の日記でRuby向け自作データベースの話をしたけれど、最近また開発を始めました。
これまではリレーショナルDBの考えに基づいて設計していましたが、今回の新しいバージョンでは、オブジェクトDBとして運用できるシステムにする予定です。
RDBとODBの違いは、テーブルの正規化が必須ではないこと。
複雑な構造をしたオブジェクトのインスタンスを、まるごとDBに格納して、また取り出すことが出来ます。
面倒なリレーションシップとか、テーブル結合とかそういうのを考えないでいいわけです。
そしてさらに今回はクラスとテーブルをぴったりくっつけてしまうことにしました。
例えばユーザ情報を格納するUserクラスはこのように書けます。
class User < RoData
field :name # ユーザ名
field :age # 年齢
end
これだけの記述で、テーブル定義をしつつ、モデルクラスとして利用出来るようになります。
登録処理は、
usr = User.new
usr.name = "无寿鈴"
usr.age = 18
usr.save
これで新しいユーザが登録されます。え、年齢サバ読んでるって?気のせいです。
レコードの取得はこんな感じ。
# ID:5のユーザを取得
r = User[5]
# 16歳のユーザを取得
rs = User[ age:16 ]
# 25歳未満未婚女性のユーザを取得
rs = User[ gender: :female ]{ age < 25 && !married? }
面倒なSQLを使わずに、高度な検索クエリを実行できます。
また、更新や削除も直感的に可能です。
# 全ての16歳のユーザを17歳に変更
User[ age:16 ].update( age:17 )
あと、今回のバージョンからトランザクションと排他ロックもできるようになりました。
前回のバージョンではそれがなかったために実用レベルではなかったので。
commitとかrollbackとかを明示的に呼び出すこともできるけど、ブロックを使えばもっとシンプルに操作できます。
User.transact{
User.new.save
User.new.save
User.new.save
}
3人の空のユーザを新規登録していますが、この間に何らかの例外が発生したら自動的にrollbackします。
無事ブロックを抜けたら自動的にcommitし、排他ロックも解除します。
わたしは面倒なのがとことん嫌いなので、いかに楽をできるかに神経を注いでいます。
たった一文字タイプする量を削るためには、1時間かけることも厭わないでしょう。
すごく面倒臭がりやなわけです。
- だいぶ前の日記でRuby向け自作データベースの話をしたけれど、最近また開発を始めました。