我在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对我有帮助吗?
感谢。
答案 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,您可以将光标定位在适当的位置以开始扫描。
请参阅Cursors和Secondary indexes上的文档。
如果这回答了你的问题,请告诉我。
问候,
戴夫