0

私は db4o OODB データベースに出会い、RDBMS や Hibernate/EclipseLink のような ORM を使用した従来のスタックとどのように比較するのか疑問に思いました。アプリケーションはワークフロー システムであり、時間の経過とともに拡張されます。db4o のような OODB が適切かどうかはわかりません。私はOODBに取り組んだことがないので、わかりません。助言がありますか?

4

2 に答える 2

2

やあ!以下は、DB4O に関する私自身の経験に基づいた情報です。

最近では、いわゆる OODB (オブジェクト指向データベース) の選択肢がたくさんあります。これらの同様のソリューションのリストを書く代わりに、通常の RDBMS を使用する場合とは対照的に、それがどのように機能するかを説明できます。それが実際の質問だったからです。

ウィキペディアで、最も使用されているシステムのいくつかのかなり良い比較を読むことができます: OODB の比較

NHibernate のようなツールで ORM の永続的な方法論を使用すると、永続化されたオブジェクトの背後にあるデータベースのクエリと更新に関して、より簡単に時間を割くことができます。NHibernateのようなツールは「ハイブリッド」ソリューションと考えることができますが、あなたが言及したような純粋なオブジェクトデータベース(私が自分でいくつかの作業を行ったもの)では、Versant / ActianのDB4Oを使用して、ファイルを直接操作することを選択できますファイルシステム上で、またはクライアント/サーバーのようなソリューションを選択します。DB4O は両方をサポートします。

最も一般的なシナリオはおそらく、前述のシナリオで、ローカル システム上のファイルを使用して、アプリケーションのオブジェクトの永続的なコピーを保持します。

DB4O は現在、非営利目的で無料で使用できる製品として存在し、Java と .Net の両方のバージョンがあります。どちらも同じように機能し、私の個人的な経験からすると、単純な2 ~ 10 メガバイトのデータベースから、約 10 ~ 12 GB のファイルまで、あらゆるものに対して非常にうまく機能します。

経験則として、DB4O 開発者によると、アプリケーションのデータベースが約 15 ~ 16 ギガバイトを超える必要があると予想される場合は、他のアプローチを検討する必要があります。

DB4O はシングル スレッドであるため、大量のトランザクションを処理するにはかなり高速な CPU コアが必要です。しかし、この明らかな制限を考慮すると、うまく動作します。

DB4O は拡張が容易で、オブジェクト指向データベースのほとんどのニーズをカバーするはずです。

これは、私自身のプロジェクトの 1 つから取得した一連のカスタム オブジェクトに接続して DB に書き込むことがいかに簡単かを示す短い例です: (DbPath は文字列定数です)

public static void StoreObjectsToDb(IEnumerable<SyncObject> syncObjects)
  {
     using (IObjectContainer container = Db4oEmbedded.OpenFile(DbPath))
     {
        try
        {
           foreach (var hdSyncObject in syncObjects)
           {
              container.Store(hdSyncObject);
              Console.WriteLine("Stored Object with HdID {0}\t<-->\tTfsID {1} to database.",hdSyncObject.HdId,hdSyncObject.HdTfsNo);
           }
           container.Commit();
           LogUtility.WriteToLog("Successfully wrote all objects to database.");
        }
        catch (Exception ex)
        {
           container.Rollback();
           LogUtility.WriteToLog("Could not save objects to database. Rolling back changes...\nError: {0}",ex.Message);
        }
        finally
        {
           container.Close();
        }
     }
  }

ご覧のとおり、新しいデータベースを作成してオブジェクトを格納する非常に簡単な方法があり、クラス定義自体にシリアル化コードの形式は必要ありません。

多くの OODB では従来の RDBMS 関数の多くがサポートされており、一部のシナリオでは、通常の SQL データベースを実装するオーバーヘッドは、単純にデータベースをソースに直接埋め込むよりもはるかに大きくなります。

これで問題が少し解決することを願っています。

クリス

于 2013-09-20T14:12:37.453 に答える