Я изучаю возможность создания пользовательской схемы хранения для моего приложения. Я думаю, что стоит потратить усилия на потенциальное переосмысление колеса, потому что эффективность и эффективность хранения являются основной целью, а данные и операции на нем намного проще, чем все, что обеспечивается СУРБД (без обновлений, без удаления, предопределенного набора запросов).
Я использую только небольшую часть веб-ресурсов, которые я нашел о B-Trees и B + -Trees - Wikipedia, http://www.bluerwhite.org/btree/, http://slady.net/java/bt/view.php, http://www.brpreiss.com/books/opus6/html/page342.html (последнее самое ценное).
Повторяющиеся клавиши
Первой проблемой, которую я пытаюсь решить, является то, как обращаться с дублирующимися ключами - это дерево будет действовать как индекс БД, и, например, не будет просто "вещи" с "color = red", поэтому поиск "красного" в этом дереве должен давать много результатов.
Есть два решения, которые я придумал до сих пор. Первый - это просто наличие нескольких записей в дереве для каждого из них. Но когда в дереве есть 100 000 или 1 000 000 "красных" вещей, это очень эффективно для древовидной структуры? Второй - иметь только одну запись для каждого ключа, но "полезная нагрузка", связанная с каждым ключевым, указывает на другой блок данных, который является связанным списком, указывающим на все экземпляры элементов, которые являются "красными".
Есть ли общий/лучший вариант?
B + Смена узлов дерева
Я хотел проверить предположение, которое я делаю. Скажем, у вас есть B + -Tree, высота 2 - внешние (листовые) узлы уровня 2 содержат "фактические данные". Затем вставка требует разделения листа node - лист node больше не содержит "фактических данных". Правильно ли я полагаю, что в терминах реализации, поскольку данные могут иметь существенный размер, вы вместо этого сохранили бы "указатель" как "фактические данные", поэтому, если лист node становится ветвью node, этот указатель (того же размера) вместо этого обновляется, чтобы указать на новое поддерево?
Под этим я подразумеваю, внутренние и внешние узлы, они должны быть того же размера, потому что внешние узлы могут стать внутренними, а перетасовка данных вокруг не является хорошей идеей?
(Добавлен тег С#, поскольку я реализую это с нуля в С#.)