BDB,如何按指定顺序获取主键?

时间:2011-01-26 03:05:36

标签: database algorithm sorting selection berkeley-db

我在oracle论坛上问了几天同样的问题,但没有回答:( 链接是:http://forums.oracle.com/forums/thread.jspa?threadID = 2162345& tstart = 0

嗨,我使用BDB构建BBS作为后端数据库,论坛数据库,主题数据库和后期数据库共享一个环境。这个BBS Web应用程序是多线程程序。如果用户选择一个论坛,其主题将按照上次回复时间的顺序列出;选择一个主题,帖子也按回复时间顺序列出。

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
};

我为主题创建了一个主数据库和两个辅助数据库,主键是topicID,辅助键分别是forumID和dateOfLastReply,我想在第一个浏览器页面上显示最新回复时间顺序中的前25个主题,第二个25个主题在第二个浏览器页面上,等等。

如果使用SQL,它将是: SELECT topicID FROM 主题 WHERE forumID = xx ORDER BY dateOfLastReply的 DESC

从性能角度来看,我想获得同一个论坛的所有主题ID,并且需要他们回复时间顺序,然后根据返回的topicID逐个检索主题,我该怎么做?我想我必须使用连接。 另外,您是否对检索性能有任何建议,因为每次浏览器想要请求下一页时都会发生主题检索,即本论坛的第25个主题? DB_DBT_MULTIPLE对我有帮助吗?

感谢。

3 个答案:

答案 0 :(得分:1)

您使用的是BDB的新SQL access layers吗?如果是这样,只需使用SQL。

如果没有,BDB(大部分)只是一个键值数据存储区。它有几种访问方法(哈希,B +树等),但它的核心就是它的全部。如果要按非主键进行排序/搜索,则必须在这些值上创建索引,并在自己的代码中进行搜索/加入。

答案 1 :(得分:1)

您需要使用复合键创建辅助数据库,该复合键由(forum_id,dateoflastreply)组成。然后,您想要的所有结果将在一个连续的行范围内,您可以通过范围扫描查询它们(例如,以(1,2010-01-01)开头的20行)。

答案 2 :(得分:0)

假设topic_secondary数据库(包含辅助密钥)是通过DB_ASSOCIATE定义的,那么您将在topic_secondary数据库上打开游标并使用DBC-> get()和DB_SET_RANGE将光标放在所需的forumID上并从那里向前移动光标。

通过在辅助数据库上使用游标,可以按所需顺序获取从主数据库返回的数据。通过使用DB_SET_RANGE在初始DBC-> get()中指定forumID,您可以将光标定位在适当的位置以开始扫描。

请参阅CursorsSecondary indexes上的文档。

如果这回答了你的问题,请告诉我。

问候,

戴夫