Estoy buscando una manera de estructurar la base de datos con VirtualTreeView y la base de datos SQLite para la recuperación rápida de datos. Con VirtualTreeView hay un evento OnNodeInit pero no siempre es práctico para este propósito.Cómo estructurar la base de datos para acceso rápido a los nodos
Los datos se obtienen de los grupos de noticias de Usenet y deben enhebrarse. Los datos útiles para el enhebrado son la identificación posterior (int64, también la clave principal), las referencias (cadenas que se refieren a publicaciones anteriores en el hilo).
El programa busca cadenas en las referencias y determina bajo qué postid debería ir. Así, por ejemplo, ID = 1234, entonces el próximo post podría ser 1235, 1236 y luego podría ser la respuesta a 1234.
Aquí es un posible ejemplo de base de datos:
post id references parent id
1234 .... .... 0
1235 .... .... 0
1236 .... .... 1234
Así que ahora esta es la forma en que se ve bien ahora.
Ahora, el problema es cómo estructurar estos datos para una recuperación más rápida. Si solo hay un nodo raíz, puedo asignar RootNodeCount en base a las entradas de la base de datos y luego en OnNodeInit leerlos uno por uno según lo solicitado. Cuando tengo nodos secundarios, entonces tengo que reorganizar de alguna manera la base de datos para que sepa cómo obtener subnodos más rápidamente dependiendo de qué nodo se abre.
Estaba pensando en asignar el campo adicional "has_subnodes" con ID del subnodo que sigue. Cuando se hace clic en un nodo, entonces lee ese nodo y cada nodo vinculado.
¿Cómo organizarías esta base de datos para que se pudiera leer muy bien en OnNodeInit o usarías ese evento en absoluto? Los nodos pueden iniciarse también utilizando el método AddChildNoInit(). Cualquier idea o puntero sería bienvenida.
ACTUALIZACIÓN (y cómo lo resolví)
Hay alguna información no relacionada con VirtualTreeview disponible aquí: Implementing a hierarchical data structure in a database
Lo que terminé haciendo es utilizando Modificado Preordenes Árbol de recorrido para almacenar información en base de datos sobre nodos y cada vez que se solicita primero un nodo determinado:
a) se busca en la memoria caché interna que básicamente mantiene la estructura idéntica a la estructura VirtualTreeView.
b) si se encuentra en la memoria caché, se quita esta entrada de caché (nunca contiene más de 100 artículos)
c) si no se encuentra, 100 elementos adicionales se añaden en la memoria caché (50 hasta desde el nodo solicitado, y 50 abajo). Este número de curso se puede modificar a 500 o 1000 artículos si es necesario. Hay algunos controles adicionales para ver cuánto cuesta arriba/abajo necesita leer para evitar leer demasiadas entradas duplicadas.
d) si necesito más velocidad, puedo aplicar una técnica adicional: cargar nodos desde la base de datos en función de cuánto desplaza el usuario virtualtreeview, similar a como std :: vector asigna memoria, primero cargo solo 100 nodos, luego si el usuario se desplaza mucho, cargo 200, luego 400, etc. ... cuanto más se desplaza el usuario, más rápido carga todo el árbol, pero aún no lo carga si nunca se desplaza.
De esta manera, los nodos que nunca se ven nunca se cargan desde la base de datos. Funciona bien para desplazarse con la rueda del mouse (con un pequeño retraso ocasional cuando pasa el punto donde la memoria caché está vacía y necesita más datos del disco) y para desplazarse con las teclas/botones de flecha.Es un poco más lento cuando arrastra la barra de desplazamiento a cierta posición (por ejemplo, de abajo hacia el centro), pero eso es de esperar ya que los datos no se pueden obtener del disco de forma instantánea.
Lo mejor es determinar de antemano la cantidad de memoria que quiero usar para la memoria caché/elementos antes de cargarlos, cuanto más rápido sea el desplazamiento pero, por supuesto, utilizará más memoria si los datos nunca se muestran.
Padre. Necesitará la referencia de los padres – OnTheFly
Básicamente, los datos de árbol más simples tienen un 'ID' y' ParentID', donde ParentID apunta a la ID a la que pertenece cuando era un niño. Colocar los nodos secundarios en el nodo primario apropiado (en la forma más simple) requeriría iterar a través de todos los nodos existentes hasta que encuentre uno con ID igual a ParentID. Aunque iterar a través de todos los nodos de VirtualTreeView es muy rápido, puede volverse muy lento a medida que se agregan más nodos. Un método más rápido sería agregar todos los nodos como una lista plana y luego moverlos a las posiciones apropiadas, aunque el algoritmo podría ser un poco más complejo. – LightBulb
@LightBulb Pero luego pierdo la virtualidad del árbol y no los agrego dinámicamente? Si hay muchos nodos y subnodos, ¿no es necesario agregar aquellos que aún no están abiertos? – Coder12345