Ниже приведён пример ТЗ/чек‑листа, по которому удобно строить учебную СУБД “с нуля”. Его можно использовать как ориентир для собственного проекта или как основу для курсовой/пет‑проекта.
Документ специально написан в “инженерном” стиле: требования + критерии готовности.
Реализовать учебную реляционную СУБД, демонстрирующую полный путь обработки запроса:
- приём SQL (клиент/сервер),
- разбор и анализ,
- построение плана,
- исполнение,
- чтение/запись данных в страницах на диске,
- применение индексов для ускорения выборок.
В рамках проекта допускается сознательная упрощённость:
- без полноценной транзакционной модели,
- без сложной оптимизации и полноты SQL‑стандарта,
- с фокусом на читаемости кода и тестируемости.
- Сервер принимает соединения по TCP.
- Протокол обмена: framed (length‑prefixed).
- Запрос: SQL‑строка в UTF‑8.
- Ответ: JSON (успех/ошибка).
Критерии готовности:
- Сервер запускается, принимает подключения, корректно закрывает ресурсы.
- Клиент может отправить запрос и получить ответ.
- Ошибки возвращаются в едином формате с указанием стадии (lexer/parser/semantic/...).
- Интерактивный режим.
- Команда выхода.
- Печать результатов в табличном виде.
- Опционально: режим вывода raw JSON.
Обязательные команды:
CREATE TABLEINSERT INTO … VALUES …SELECT … FROM … [WHERE …]CREATE INDEX … USING …
Поддерживаемые типы:
INT64VARCHAR
Поддерживаемые выражения:
- арифметика (
+,-,*,/) для чисел, - сравнения (
=,!=,<,>,<=,>=), - логика
AND/OR.
Критерии готовности:
- парсер принимает корректные запросы диалекта и отклоняет некорректные,
- семантический анализ валидирует таблицы/колонки/типы,
SELECTвозвращает корректный результат,INSERTизменяет данные.
Требования к стадиям:
- Lexer: токенизация.
- Parser: AST.
- Semantic: типизация и проверка имён.
- Planner: логический план.
- Optimizer: физический план (правила выбора scan/index scan).
- Execution: исполнители (Volcano).
Критерии готовности:
- стадии отделены, тестируются по отдельности,
- можно отследить “на каком этапе упал запрос”.
Требования:
- дисковое хранение в виде heap‑страниц фиксированного размера,
- наличие
TID(pageId + slotId), - сериализация строк в байты и обратно,
- менеджер страниц (read/write fixed‑size page),
- buffer pool с политикой вытеснения (например, LRU/Clock),
- flush dirty pages.
Критерии готовности:
- данные сохраняются на диск и доступны после перезапуска,
- есть тесты на чтение/запись страниц и сериализацию.
Минимум два типа:
HASHдля точечного поиска,BTREE(B+Tree) для диапазонов.
Требования:
- индекс хранит (key → список TID),
- оптимизатор умеет выбирать индексный скан,
- executor умеет извлекать строки по TID.
Критерии готовности:
- есть unit‑тесты на индекс,
- есть интеграционный тест “создать индекс → запросы начали выполняться через index scan”.
- Язык: Java 17.
- Сборка: Gradle (wrapper).
- Код должен быть разделён на модули/пакеты по ответственности.
- Покрытие тестами: unit + хотя бы один end‑to‑end сценарий (по TCP).
- Документация: README + архитектура + примеры.
В репозитории ожидаются:
- исходный код,
- автосборка (Gradle wrapper),
- тесты,
- документация (
README.md+docs/…), - скрипты запуска (опционально).
UPDATE/DELETE,DROP.- JOIN.
- Транзакции (WAL, блокировки, MVCC).
- Cost‑based оптимизатор.