BDB, как получить первичные ключи в указанном порядке? - PullRequest
0 голосов
/ 26 января 2011

Я задавал один и тот же вопрос в течение нескольких дней на форумах оракула, но ответа не последовало :( ссылка: http://forums.oracle.com/forums/thread.jspa?threadID=2162345&tstart=0

Привет, я создаю BBS, используя BDB в качестве внутренней базы данных, базы данных форума, базы данных тем и базы данных постов в одной среде. Это веб-приложение BBS является многопоточной программой. Если пользователь выбирает один форум, его темы будут перечислены в порядке последнего ответа, при выборе одной темы сообщения будут перечислены в порядке времени ответа.

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 topic WHERE forumID = xx ORDER BY dateOfLastReply DESC

С точки зрения производительности, я хочу получить идентификаторы всех тем одного и того же форума, и нужно, чтобы они приходили в порядке времени ответа, а затем извлекать темы одну за другой на основе возвращенного идентификатора themeID, как я могу это сделать? думаю, я должен использовать соединения. Кроме того, есть ли у вас какие-либо предположения о производительности поиска, учитывая тот факт, что поиск по темам будет происходить каждый раз, когда браузер захочет запросить следующую страницу, то есть 2-ые 25 тем этого форума? DB_DBT_MULTIPLE полезен для меня?

спасибо.

Ответы [ 3 ]

1 голос
/ 27 января 2011

Необходимо создать вторичную базу данных с составным ключом, состоящим из (forum_id, dateoflastreply). Затем все требуемые результаты будут находиться в непрерывном диапазоне строк, и вы можете запросить их, выполнив сканирование диапазона (например, 20 строк, начинающихся с (1, 2010-01-01)).

1 голос
/ 26 января 2011

Используете ли вы новые слои доступа SQL BDB ? Если это так, просто используйте SQL.

Если нет, BDB - это (в основном) просто хранилище данных со значением ключа. У него есть несколько методов доступа (хеш, дерево B + и т. Д.), Но в его основе все. Если вы хотите сортировать / искать по неосновным ключам, вам придется создать индексы для этих значений и выполнить поиск / объединение в своем собственном коде.

0 голосов
/ 27 января 2011

Если предположить, что база данных topic_secondary (которая содержит вторичные ключи) определена через DB_ASSOCIATE, то вы бы открыли курсор на базе данных topic_secondary и, используя DBC-> get () с DB_SET_RANGE, поместили курсор на желаемый forumID и переместите курсор вперед оттуда.

Используя курсор на вторичной базе данных, вы получаете данные, возвращенные из первичной базы данных в нужном порядке. И, указав forumID в начальном DBC-> get () с помощью DB_SET_RANGE, вы можете расположить курсор в нужном месте, чтобы начать сканирование.

См. Документацию по Курсорам и Вторичные индексы .

Пожалуйста, дайте мне знать, если это ответит на ваш вопрос.

С уважением,

Dave

...