Почему бы не иметь две таблицы, одну для узлов и одну для элементов? (Обратите внимание, что я использовал термин «лист» вместо узлов «данные» ниже, когда писал свой ответ; узел «лист» содержит элементы данных, а узел «не лист» содержит другие узлы.)
Таблица узлов будет иметь следующие столбцы: id primary key, parentid references node, leaf boolean
и, кроме того, некоторые столбцы для описания пространственных границ узла и того, как он будет / был разбит. (Я не знаю, работаете ли вы в 2D или 3D, поэтому я не дал подробностей о геометрии.)
Таблица данных будет иметь id primary key, leafid references node
и любые другие данные.
Вы можете пройти по дереву вниз, выполнив SELECT * FROM node WHERE parentid = ?
запросов на каждом уровне и проверив, к какому дочернему элементу спуститься. Добавить элемент данных на лист просто INSERT
. Разделение узла требует снятия флажка листа, вставки двух новых узлов листа и обновления всех элементов данных в узле, чтобы они указывали на соответствующий дочерний узел, изменяя их значения листьев.
Обратите внимание, что обходные пути SQL могут быть дорогими, поэтому, если вы хотите использовать это для реального приложения, рассмотрите возможность использования относительно большого t
в БД для построения более мелкозернистого дерева в памяти о листьях, которыми вы являетесь заинтересованы после того, как у вас есть элементы данных.