2

朗報です!バージョン4.8以降、BerkeleyDBにはc#インターフェイスがあります。BerkeleyDBは、SQL以外の性質があるため、私にとって非常に興味深いものです。誰かが多くのキーと値のペアを保存したい場合、それは優れたツールであることを私は知っています。そして、私は「アタッチ可能な」テーブルについて知っています。私が知らないのは、BerkeleyDBを使用して階層データを保存する方法です。一般的にこれに適していますか?

私がやりたいこと?dmoz.orgのデータを保存したい。これで、すべてのrdfsがMySQLデータベースにインポートされました。ただし、ストアドプロシージャやその他の複雑な機能は必要ありません。オンラインRSSリーダーのデータストアとしてBerkeleyDBを使用したいと思います。したがって、カテゴリツリーにはフィードがあります(私がdmozからインポートしたカテゴリを言ったように、たくさんのフィードとフィードがあります-数百万)。そして...私はフィードアイテムを忘れました。BerkleyDBでそれらも保存したい:-)。

すべての関係を手動で実装する必要があるようです、、、大丈夫です...しかし、私が尋ねる最も重要なことは速度です。BerkeleyDBを使用したソリューションは、MySQL(または一般的なRDBMS)をベースにしたソリューションよりも高速になりますか?

4

2 に答える 2

2

これには適していますが、入力するよりも手間がかかる場合があります。BerkeleyDBは非常に一般的なキー/値ストアであるため、「キーXの場合、値Yを保存する」と言うだけです。後で「キーXの値を教えて」と言うと、Yが返されます。これが高レベルからのすべてです。重要な信頼性プロパティ(ACID、Atomicity、Consistency、Isolation、およびDurabilityと呼ばれる)を保証するための非常に堅牢な機能を備え、優れたパフォーマンスを備えていますが、プログラマーの観点からは、単純なマップ構造です。

そうです、あなたは木を保存することができます、しかしあなたはそれらのための良い表現を決める必要があるでしょう。整数キーを選択し(BDBはキーに辞書式順序を使用するため、ビッグエンディアンのバイト順序で格納されていることを確認してください)、子の整数のリストを含む値として構造体を使用できます。ただし、すべてのトラバーサルアルゴリズムを手動で作成する必要があります。ただし、階層データにどのような要件があるかを知らなければ、より具体的な提案をすることは困難です。

速度的には、Berkeley DBはおそらくそれほど速くなることはできません(つまり、特にACIDプロパティの一部を犠牲にする場合は、それほど速くなることはありません)。これにより、マップへのインターフェイスをほぼ完全に制御できるため、理論的には、特定のユースケース向けに高度に最適化された構造を構築できます。ただし、低レベルのインターフェイスを考えると、結合、複雑なフィルタークエリ、またはその上に重要なクエリ言語を実装している場合は、大きなものに対応するために非常に高速なコードとアルゴリズムを作成する必要があります。そこにリレーショナルデータベース。

データをXMLでモデル化できる場合(そうですが、好きな人もいます)、BDB XML(現在はOracleの一部であるSleepycat)と呼ばれるBDB上に構築された既存のデータベースがあります。これにより、任意のXMLドキュメントをデータベースに保存し、データベースで高速XPathおよびXQueryクエリを実行できます。これに対する公式の.NETAPIはまだないと思いますが、非公式の.NETバインディングに出くわしたことは間違いありません。

一般に、既存のソリューションで許可されていない非常に特別な要件がない限り(これはシナリオには当てはまらないようです)、独自のデータベース(BDB上に構築されている場合でも)をロールすることはお勧めしません。効率的なアルゴリズムとコードの最適化に非常に熟練していない限り。RDFトリプルを格納している場合は、そのための専用データベースがあり、リレーショナルデータベースでさえそれらに特に適していないわけではありません。BDB XMLは、そのための実行可能なソリューションでもあります。最終的にはあなたの選択ですが、私があなたなら、低レベルのデータベース操作を処理することなく、より興味深い問題に取り組むことを選択します(したがって、実際のRDFストアの既存のパッケージの上に薄いレイヤーを使用します)。

于 2009-11-03T18:44:20.670 に答える
1

階層構造は、親属性または子属性を使用してKey-Valueストアに格納できます。

親に1つ以上の子を持たせたい場合は、各レコードで親属性を使用し、ルートノードにID0またはその他の意味のある値の親を持たせます。

子に1つ以上の親を持たせたい場合は、各レコードで子属性を使用します。

必要に応じて、ノードに複数の親があり、子は別のテーブルを使用して関係を格納します。

このようにして、特定の親または子を持つノードを照会することにより、ツリーをトラバースできます。

于 2009-11-03T18:42:06.913 に答える