Я ищу способ структурирования базы данных с помощью базы данных VirtualTreeView и SQLite для быстрого извлечения данных. В VirtualTreeView есть событие OnNodeInit bu, это не всегда удобно для этой цели.Как структурировать базу данных для быстрого доступа к узлу
Данные извлекаются из групп новостей Usenet и должны быть пронизаны резьбой. Данные, полезные для потоковой передачи, - это post id (int64, также первичный ключ), ссылки (строки, относящиеся к предыдущим сообщениям в потоке).
Программа ищет строки в ссылках и определяет, по какому положению она должна идти. Так, например, после ид = 1234, то следующая запись может быть 1235, а затем 1236 может быть ответом на 1234.
Вот возможный пример базы данных:
post id references parent id
1234 .... .... 0
1235 .... .... 0
1236 .... .... 1234
Так что теперь это, как она выглядит Теперь.
Теперь проблема заключается в том, как структурировать эти данные для более быстрого поиска. Если есть только корневой узел, я могу назначить RootNodeCount на основе записей базы данных, а затем в OnNodeInit читать их один за другим по запросу. Когда у вас есть суб-узлы, мне нужно как-то перегруппировать базу данных, чтобы он знал, как быстрее получать субноды в зависимости от того, какой узел открыт.
Я думал назначить дополнительное поле «has_subnodes» с последующим идентификатором нижележащего узла. При щелчке узла он считывает этот узел и каждый связанный узел.
Как бы вы организовали эту базу данных, чтобы ее можно было хорошо прочитать в OnNodeInit или вы вообще использовали бы это событие? Узлы могут быть инициированы с использованием метода AddChildNoInit(). Любые идеи или указатели приветствуются.
UPDATE (И КАК РЕШИТЬ ЭТО)
Существует некоторые не virtualtreeview связанные информации здесь: Implementing a hierarchical data structure in a database
То, что я в конечном итоге делает это с помощью Modified Preorder обходе дерева для хранения информации в база данных о узлах и каждый раз, когда запрашивается определенный узел:
a) он просматривается во внутреннем кеше, который в основном сохраняет идентичную структуру структуры VirtualTreeView.
б) если найдено в кэше, этот элемент кэша удаляется (он никогда не держит более 100 наименований)
С), если не найден, дополнительные 100 элементов добавляются в кэше (50 вверх от запрашиваемого узла, и 50 вниз). Этот номер может быть изменен до 500 или 1000 элементов, если это необходимо. Есть несколько дополнительных проверок, чтобы увидеть, как много вверх/вниз нужно читать, чтобы не читать слишком много дубликатов записей.
d) если мне нужна дополнительная скорость, я могу применить дополнительную технику - загружать узлы из базы данных в зависимости от того, сколько пользователь прокручивает virtualtreeview - подобно тому, как std :: vector выделяет память - сначала я загружаю только 100 узлов, тогда if пользователь прокручивает много, я загружаю 200, затем 400 и т. д. ... чем больше пользователь прокручивает, тем быстрее он загружает все дерево, но все равно не загружает его, если он никогда не прокручивает.
Таким образом, узлы, которые никогда не видны, никогда не загружаются из базы данных. Он отлично работает для прокрутки с колесиком мыши (при случайной короткой задержке, когда он проходит точку, где кеш пуст и для этого требуется больше данных с диска) и для прокрутки со стрелками/клавишами.Это немного медленнее, когда вы перетаскиваете полосу прокрутки в определенную позицию (скажем, снизу до середины), но это ожидается, поскольку данные не могут быть извлечены с диска мгновенно.
Лучше всего, если я предварительно определю, сколько памяти я хочу использовать для кеша/элементов, прежде чем загружать их, тем больше ускорение прокрутки, но, конечно же, оно использует больше памяти, если данные никогда не отображаются.
Родитель. Вам нужна ссылка для родителей – OnTheFly
В принципе, простейшие древовидные данные имеют идентификаторы «ID» и «ParentID», где ParentID указывает на идентификатор, к которому он принадлежит в качестве ребенка. Размещение дочерних узлов под соответствующим родительским узлом (в простейшей форме) требует повторения всех существующих узлов до тех пор, пока вы не найдете идентификатор, равный ParentID. Хотя итерация через все узлы VirtualTreeView происходит очень быстро, она может стать очень медленной по мере добавления большего количества узлов. Более быстрый метод заключается в том, чтобы добавить все узлы в виде плоского списка, а затем переместить их в соответствующие позиции, хотя алгоритм может быть немного сложнее. – LightBulb
@LightBulb Но тогда я теряю виртуальность дерева и не добавляю их динамически? Если есть много узлов и подузлов, нет необходимости добавлять те, которые еще не открыты? – Coder12345