2011-01-26 32 views
0

私はOracleのフォーラムでいくつかの日に同じ質問をしましたが、何の答えは リンクがある:(来なかったします。http:?//forums.oracle.com/forums/thread.jspaスレッドID = 2162345 & TSTART = 0BDB、指定された順序で主キーを取得する方法?

こんにちは、BDBをバックエンドデータベース、フォーラムデータベース、トピックデータベース、ポストデータベース共有環境として構築しています。このBBS Webアプリケーションはマルチスレッドプログラムです。ユーザーが1つのフォーラムを選択すると、トピックが最後に表示されます1トピックを選択し、ポストは、同様の応答時間の順に表示され

struct forum { 
UInt16 forumID; 
string forumName; 
string _lastPoster; // who is the last one replied in this forum 
}; 

struct topic { 
UInt32 topicID; 
UInt16 forumID; // topic comes from this forum 
string title; // topic title 
UInt64 dateOfLastReply; // when last reply to this topic happen 
}; 

struct post { 
UInt64 postID; 
UInt32 topicID; // post comes from this topic 
string title; // post title as of topic 
UInt64 dateOfPost; // when this post is created 
}; 

私は1つのプライマリ・データベースとtのための2つのセカンダリデータベースを作成し、時間を返信します。 opic、プライマリキーはtopicID、セカンダリキーはforumID、dateOfLastReplyであり、第1のブラウザページの最新の返信時間順、第2のブラウザページの第2の25のトピックなどを表示したい。

SQLを使用している場合、それは次のようになります。パフォーマンスの観点から forumID = XX ORDER dateOfLastReply DESC BY

トピックFROM TOPICID を選択、私は1つの同じフォーラムのすべてのトピックIDを取得したい、と彼らは応答時間の順序で来る必要があります、次にトピックを取得する返されたtopicIDに基づいて1つずつ、どうすればいいですか?私は結合を使用しなければならないと思う。 さらに、ブラウザが次のページ、つまり、このフォーラムの第2の25のトピックをリクエストするたびに、トピックの取得が行われるという事実を考慮して、検索のパフォーマンスに関する提案はありますか? DB_DBT_MULTIPLEは私にとって役に立ちますか?

ありがとうございました。

答えて

1

(forum_id、dateoflastreply)で構成される複合キーを使用してセカンダリデータベースを作成する必要があります。次に、必要なすべての結果が連続した行の範囲にあり、範囲スキャン(たとえば、(1、2010-01-01)で始まる20行)を実行することによってクエリを実行できます。

+0

こんにちはニック、私もコンポジットキーが私に役立つかもしれないと思う、しかし、私は複合キーを作成する方法を知らない?それはDB_DBT_MULTIPLEですか?私は比較機能をカスタマイズする必要がありますか?等のサンプルコードが良いかもしれません。 – tiplip

+0

私はしばらくの間BDBで作業していないので、サンプルコードを提供することはできません。一般的に、すべてのBDB値はバイトなので、フィールドを一緒にエンコードすることで合成値を作成する必要があります。例えば、両方のフィールドが固定長であり、それらを連結しただけの場合は、これは単純なものでなければなりません。エンコードされた値が期待どおりにバイト順にソートされている限り、カスタム比較関数は必要ありません。 –

1

BDBの新しいSQL access layersを使用していますか?その場合は、SQLを使用してください。

もしそうでなければ、BDBは主にキー値データストアです。それはいくつかのアクセスメソッド(ハッシュ、B +ツリーなど)を持っていますが、その核心はすべてです。非主キーでソート/検索する場合は、それらの値にインデックスを作成し、自分のコードで検索/結合する必要があります。

+0

こんにちは、私は非SQLバージョンBDBを使用しています。はい、私はBDBがキーバリューデータベースであることを知っていますが、二次インデックスも作成しましたが、私の質問に記載されているように私の要件を満たす方法は見つけられません – tiplip

+0

セカンダリインデックスがdateflastreplyにある場合、その範囲で反復するだけです。あなたはまだそれぞれのWHERE forumID条件と手動で比較する必要があります。とにかくデータベースエンジンが内部的に何をするのか。 – CoreyStup

+0

こんにちはCoreyさん、BDBは挿入または更新中にレコードをソートしないことを意味しますか?もともとは、BDBは、set_bt_compareで設定されたcompare関数を使用して、挿入または更新しながらレコードをソートすると思います。 – tiplip

0

(二次キーを含む)topic_secondaryデータベースがDB_ASSOCIATEで定義されていると仮定すると、topic_secondaryデータベースでカーソルを開き、DB_SET_RANGEでDBC-> get()を使用すると、カーソルを目的のforumIDそこからカーソルを前方に移動させます。

セカンダリデータベース上のカーソルを使用すると、プライマリデータベースから返されたデータが必要な順序で取得されます。また、最初のDBC-> get()にDB_SET_RANGEを指定してforumIDを指定することで、カーソルを適切な場所に配置してスキャンを開始することができます。

CursorsSecondary indexesのドキュメントを参照してください。

これがあなたの質問に答えるかどうかお知らせください。

よろしく、

デイブ

+0

こんにちは、あなたの答えに感謝し、私はそれを試してみましょう。私が知っているように、ソートは挿入中に起こります。つまり、希望の順序を取得したい場合は、getの代わりに挿入(put)したレコードをソートしておく必要があります。すべての必要なレコードが返された後、アプリはソートを行うことができますが、これはおそらくパフォーマンス上のペナルティです – tiplip

+0

インデックスに応じて、キーはソート順に挿入されます。あなたのテーブルがBTreesであると仮定しています。その場合、データはキーに基づいてソートされます。 – dsegleau

+0

こんにちは、forumIDとdateOfLastReplyのコンポジットキーを使用して、私の必要条件を満たすcompare関数を設定したsencondaryデータベースを作りました。 – tiplip

関連する問題