无寿鈴さんとモバ友になろう!

日記・サークル・友達・楽しみいっぱい!

Yahoo! JAPAN IDだけで遊べる!今すぐ遊ぶ!

    • 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時間かけることも厭わないでしょう。
      すごく面倒臭がりやなわけです。

コメント一覧

更新する

この日記を違反通報する

无寿鈴さんの
最新日記

无寿鈴さんの
お友達の最新日記

日記を探す

気になるキーワードで検索

みんなの新着日記