18

私はdb4oオブジェクトデータベースを試していますが、これまでのところ私が見ているものはかなり気に入っていますが、スタックオーバーフローdb4oエクスペリエンスに関するこの投稿も読んでいますか? 簡単そうに見えることがすべて簡単ではないことを示しています。

現在、実際のアプリで db4o がどのように使用されているかについていくつか質問があります。ですから、db4o を (特に Web アプリケーションのコンテキストで) 使用した経験がある場合は、ぜひお聞かせください。

ここに私の質問があります:

  1. db4o に格納されたオブジェクトを操作するときに、オブジェクト ID をどのように管理しますか?**
    RDBMS のバックグラウンドから来て、通常は常にすべてのテーブルに主キー/ID 列があるため、db4o でオブジェクト ID を管理する方法について今のところ想像できません。

    たとえば、NHibernate / mysql を使用していて、id でユーザー オブジェクトを検索する必要がある場合、session.Load(primaryKey) を実行すると、その PK によって取得されます。PK がテーブル定義で自動インクリメントとして定義されていることも非常に一般的です。

  2. db4o にはそのようなオプションがないため、オブジェクト データベース内のいくつかのオブジェクトを識別するために Guid 構造体を使用することを考えました。

  3. データベースに保存されたオブジェクトを表示するツールはありますか?

    db4o の世界に SQL Server Management Studio (おそらくあまり洗練されていない) のようなものはありますか? db ファイルに既に保存されているデータ/オブジェクトを表示したいと思います。

  4. ドメイン オブジェクトの名前を変更するときにうんざりしていませんか?

    クラスの名前を変更すると、以前にデータベースに保存されたインスタンスを取得できなくなります。この問題を回避する方法はありますか? すでに多くのオブジェクトを含むライブ データベースに対する更新をどのように処理しますか?

  5. プロパティを DB に保存しないようにすることはできますか?

    たとえば、1 つのドメイン オブジェクトが (ステートレス) サービス オブジェクトへの参照を保持している場合、ドメイン オブジェクトが永続化されるとサービス オブジェクトも永続化されますよね?

少なくとも私には、サービス インスタンスをデータベースに保存するのは少し奇妙に思えます。

サービス インスタンスを保存から除外できますか? ドメイン オブジェクトが再度取得された場合、サービスがインスタンスにも再度挿入されるようにするにはどうすればよいですか?

4

3 に答える 3

13

1) db4o に保存されたオブジェクトを操作するとき、オブジェクト ID をどのように管理しますか? db4o では、通常、ID はありません。db4o はobject-identityを使用してオブジェクトを区別します。したがって、メモリ内の同じオブジェクトは、データベースの同じオブジェクトになります。

オブジェクトをシリアル化しない限り、これは正常に機能します。ただし、オブジェクトがシリアル化/切断されるとすぐに、これは機能しなくなります。たとえば、Web シナリオでは、データをブラウザに送信します。ここで、後でいくつかの ID によってオブジェクトを再度識別する必要があります。

次の 3 つのオプションが考えられます。 - db4o 内部 IDを使用します。ただし、この ID は永遠ではありません。データベースを最適化すると、この ID が変更されます。- db4o の UUID の使用。しかし、db4o UUID は非常に大きい - 自分で ID を作成する

2) データベースを調べるための Object-Manager Tool があります。しかし、現在の状態では非常に限られています。私の意見では、これは db4o の大きな欠点です。

3)エイリアスを作成したり、クラスやフィールドの名前を変更したりできます。ただし、継承階層を変更しても機能しません。次に、古いデータを新しいインスタンスにコピーする必要があります。

4) はい。.NET-NonSerialized 属性またはカスタム属性を使用して、フィールドを一時的としてマークできます。

于 2009-11-12T23:20:24.180 に答える
2

オブジェクト指向データベース (db4o など) では、オブジェクト ID は実際には使用しないでください。代わりに、クエリとナビゲーションを使用しました。最初にクエリを実行して 1 つまたはいくつかのオブジェクトを取得し、次にナビゲーションを使用して他のオブジェクトに移動します。

「ナビゲーション」とは、ロードされたオブジェクトのフィールド/参照をたどることを意味します。

オブジェクト識別子を使用することは悪いスタイルと見なされる可能性があり、ほとんどのアプリケーション (私が知っている) はそれらをまったく使用しません。

于 2012-01-23T17:10:48.203 に答える
1

DB4O でいくつかの作業を行っているときに、含まれているものよりもはるかにうまく機能する単純な DB4O オブジェクト ブラウザーを作成しました。試してみてください。オープンソースです。

http://sourceforge.net/projects/db4oviewer/develop

于 2011-11-14T21:47:34.203 に答える