DictionaryForumContacts

Описание модели базы данных

В большинстве задач с несколькими целями (такими как скорость работы, объем файла, пополняемость и т.д.) часто приходится оптимизировать один из параметров в ущерб другим. Так, можно создать эффективный алгоритм поиска, который, однако, потребует больших затрат ресурсов памяти, места на диске и т.д. К счастью, с базами данных дело обстоит иначе. Уменьшая объем базы, можно добиться и увеличения скорости работы. Если объём базы данных  для современных поисковых систем практически не имеет значения, то скорость работы остается существенным показателем при работе в реальном времени.
В качестве основы для разработки базы словаря Мультитран было выбрано слаборастущее сильноветвящееся несимметричное Б-дерево с плавающей длиной записи и оптимизациями, расчитанными на сохранение высоких показателей работы при пополнении базы.
Классическая модель двоичного дерева была реализована следующим образом:

Поиск в базе

Поиск начинается с корневой страницы методом перебора хранящихся на ней упорядоченных по возрастанию записей. При обнаружении записи, которая при побайтовом сравнении больше либо равна искомой, происходит обращение к странице базы, на которую ссылается найденная запись. Поиск продолжается в цикле по страницам, пока не будет достигнут самый нижний уровень базы, содержащий реальные данные. В результате поиска на нижнем уровне будет найдена искомая запись (или несколько одинаковых записей), либо ближайшая к ней.

Добавление записей

При добавлении записи происходит ее поиск и определяется место, куда она должна быть добавлена. Место добавления записи - это всегда некоторая позиция на нижнем уровне базы. Затем определяется требуемое количество байтов для новой записи. Если на странице достаточно места, новая запись записывается в текущую страницу, на чем пополнение и заканчивается. Если, однако, места на текущей странице недостаточно, страница делится приблизительно пополам (место деления определяется по минимальной общей части двух следующих подряд записей). Первая часть страницы записывается на место первоначальной страницы. Вторая часть страницы попадает в конец файла. Полученный разделитель добавляется на верхний уровень базы, где выполняются действия, аналогичные описанным. Верхний уровень также может переполниться, тогда разделитель добавляется на еще более старший уровень. Наконец, при переполнении корневого уровня базы создается новый корневой уровень и высота базы возрастает на единицу, а скорость поиска падает на (h + 1)/h, где h - высота двоичного дерева до пополнения. Происходит это, впрочем, достаточно редко, и базам, превышающим по объему 10.000 записей и достигшим высоты 3, последующий рост практически не грозит. Этим и обеспечивается высокая скорость работы словаря Мультитран.

Удаление записей

При удалении записи она физически стирается со страницы нижнего уровня. При удалении последней записи со страницы можно было бы занести эту страницу в список свободных для последующего использования, однако, исходя из практических соображений, этот механизм не был реализован. Объем лингвистических данных чаще увеличивается, чем сокращается. В связи с этим страницы, с которых удалена последняя запись, остаются в базе и могут быть устранены последующей переиндексацией.

Ограничения модели