Мини-проект, который имитирует простую работу с таблицами в памяти: создание таблицы, вставка строк, фильтрация и вывод в консоль.
Проект нужен как учебная практика по C++ и базовым идеям СУБД:
- как хранить табличные данные в памяти;
- как разделять код на классы и модули;
- как проверять типы данных при вставке;
- как делать простые запросы (фильтр по условию).
Этот проект помогает закрепить:
class,public/private, инкапсуляцию;- работу с контейнерами STL (
std::vector,std::unordered_map); - работу с типами через
std::variant(intилиstd::string); - обработку ошибок через исключения (
std::runtime_error); - разделение интерфейса (
.h) и реализации (.cpp).
Идея: сначала понять логику "маленькой базы данных", а потом уже переходить к SQL/реальным СУБД.
Проект реализует следующий сценарий:
- Создает таблицу
usersс колонками:id(Int)name(Text)age(Int)
- Добавляет несколько строк (пользователей).
- Печатает все строки таблицы.
- Фильтрует строки по условию (
age > 18). - Печатает результат фильтрации.
- создание таблиц в
Databaseпо имени; - проверка существования таблицы;
- получение таблицы по имени;
- вставка строк в
Tableс валидацией:- совпадение количества значений и колонок;
- совпадение типов значений и типа колонки;
- фильтрация строк по колонке и операции сравнения:
Equal,Greater,Less;
- вывод таблицы в консоль.
-
Value.h
Описывает типы данных:DataType(Int,Text)Value = std::variant<int, std::string>Column(имя + тип)
-
Row.h
Одна строка таблицы:std::vector<Value> values. -
Table.h/Table.cpp
Класс таблицы:- хранит имя таблицы, список колонок и строки;
insertвставляет строку с проверкой структуры и типов;getColumnIndexищет индекс колонки по имени.
-
Database.h/Database.cpp
Контейнер таблиц:- хранение через
std::unordered_map<std::string, Table>; createTable,getTable,hasTable.
- хранение через
-
Filter.h/Filter.cpp
Логика выборки:Condition(колонка + операция + значение);filterRowsвозвращает строки, подходящие под условие.
-
Printer.h/Printer.cpp
Вывод таблицы и значений в консоль. -
main.cpp
Демонстрация полного сценария работы.
- Инкапсуляция: внутренние структуры (
tables_,rows_) скрыты вprivate, доступ через методы. - Ссылки:
getTableвозвращает ссылку на существующую таблицу внутри базы. - Константность:
const-перегрузки дают безопасный доступ "только чтение". - Типобезопасность:
std::variant+std::holds_alternative/std::get. - Fail-fast: при ошибках бросаются исключения с понятным сообщением.
g++ -std=c++17 -Wall -Wextra -pedantic main.cpp Table.cpp Database.cpp Filter.cpp Printer.cpp -o minisql
./minisqlcmake -S . -B build
cmake --build buildВ консоли выводится:
- полная таблица
users; - затем таблица строк, где
age > 18.