Если вы когда-либо преподавали SQL или проходили курс по базам данных, то почти наверняка встречали Sakila - маленькую базу данных видеопроката, которая вот уже почти двадцать лет служит эталонным примером в туториалах по MySQL и MariaDB. Схема чистая, нормализованная, данных достаточно для интересных запросов.
Проблема в другом: Sakila спроектирована в 2006 году под MySQL 5.0.
С тех пор многое изменилось.
Чего Sakila не может показать
Откройте схему Sakila и пересчитайте типы столбцов: INT, VARCHAR, TEXT, ENUM, DATETIME, DECIMAL, TINYINT. Всё. Никакого JSON. Никакого полнотекстового поиска сверх базовой демонстрации. Никакого SET. И совсем никакого VECTOR.
А в MariaDB 11.7 уже есть:
нативный тип
VECTOR(N)для поиска похожих объектов в эпоху ИИ;богатые JSON-функции -
JSON_TABLE,JSON_VALUE,JSON_EXTRACT;оконные функции -
RANK,LAG,LEAD, нарастающие агрегаты;рекурсивные CTE;
FULLTEXT- поиск с булевым режимом и оценкой релевантности.
Учить SQL на Sakila в 2026 году — всё равно что учить вождению на машине без навигатора, без камеры заднего вида и с ручным подсосом. Основы те же, но половина возможностей современного инструмента остаётся за кадром.
Есть и проблема предметной области. Видеопрокат. Если вам нет сорока, вы, скорее всего, никогда туда не заходили. Ментальная модель не интуитивна, бизнес-правила кажутся надуманными. Зачем таблица payment существует отдельно от rental? На объяснение схемы уходит время, которое должно уходить на объяснение SQL.
Предметная область, понятная каждому
Нужно было выбрать что-то универсальное. Что-то с:
очевидными сущностями и связями;
несколькими естественными иерархиями (отличный повод для рекурсивных CTE);
смесью маленьких справочников и больших транзакционных таблиц;
понятной причиной хранить JSON и вектора.
Университет подходит идеально. Студенты, курсы, преподаватели, зачисления, оценки — каждый прожил внутри этой системы. Связи интуитивны. А предметная область естественным образом порождает именно те структуры данных, которые нужны для обучения:
Требование |
Что есть в университете |
|---|---|
Большая аналитическая таблица |
|
Иерархия для рекурсивного CTE |
Факультет → Кафедра → Подразделение; цепочки пресреквизитов курсов |
JSON для полуструктурированных данных |
Расписание преподавателей, контакты студентов, источники финансирования |
Полнотекстовый поиск |
Описания курсов, аннотации публикаций |
Векторный поиск |
Эмбеддинги курсов для поиска похожих |
Журнал изменений |
Каждое зачисление и оценка логируются с JSON-дифами |
Как устроена University DB
Схема содержит 16 таблиц в четырёх уровнях:
Справочники (несколько десятков строк): semesters, rooms, scholarships
Основные сущности (до 2 000 строк): departments, faculty, students, courses, course_prerequisites, sections
Транзакционные (до 10 000 строк): enrollments, student_scholarships, research_projects, publications, project_members
Аналитические (большие): grade_events (~120 тыс. строк) и audit_log (~60 тыс. строк, заполняется триггерами)
Все значимые типы данных MariaDB представлены хотя бы один раз:
-- VECTOR на courses - семантические эмбеддинги для поиска похожих курсов embedding VECTOR(1536) NULL -- JSON на faculty - гибкое расписание приёмных часов office_hours JSON NULL -- [{"day": "Mon", "start": "10:00", "end": "12:00"}, ...] -- SET на publications - множественные теги ключевых слов keywords SET('AI', 'ML', 'Databases', 'Security', 'Bioinformatics', ...) -- FULLTEXT-индексы на courses и publications FULLTEXT KEY ft_course (title, description)
В схеме есть 7 представлений, 6 хранимых процедур и 7 триггеров - в том числе триггер, блокирующий запись на переполненный курс, и три триггера, которые пишут JSON-диф изменений в таблицу audit_log.
Четыре уровня примеров запросов
Примеры разбиты на четыре файла - база данных подходит и новичкам, и опытным разработчикам:
Уровень 1 - Основы: SELECT, WHERE, GROUP BY, простая агрегация
Уровень 2 - Средний: JOIN по 5 таблицам, коррелированные подзапросы, FULLTEXT, JSON_VALUE
Уровень 3 - Продвинутый: оконные функции, CTE, рекурсивные CTE, JSON_TABLE, FIND_IN_SET, VEC_Distance
Уровень 4 - DBA/Разработчик: EXPLAIN ANALYZE, стратегия индексов, написание хранимых процедур, уровни изоляции транзакций, криминалистика по audit_log
Рекурсивный CTE для получения полной цепочки пресреквизитов курса:
WITH RECURSIVE prereq_chain AS ( -- Якорь: прямые пресреквизиты SELECT cp.prerequisite_id, p.code AS prereq_code, p.title AS prereq_title, 1 AS depth FROM course_prerequisites cp JOIN courses p ON p.course_id = cp.prerequisite_id WHERE cp.course_id = (SELECT course_id FROM courses WHERE code = 'CS300') UNION ALL -- Рекурсия: пресреквизиты пресреквизитов SELECT cp2.prerequisite_id, p2.code, p2.title, pc.depth + 1 FROM course_prerequisites cp2 JOIN prereq_chain pc ON pc.prerequisite_id = cp2.course_id JOIN courses p2 ON p2.course_id = cp2.prerequisite_id WHERE pc.depth < 10 -- защита от цикличных данных ) SELECT DISTINCT depth, prereq_code, prereq_title FROM prereq_chain ORDER BY depth, prereq_code;
Векторный поиск похожих курсов:
SELECT c.code, c.title, VEC_Distance(ref.embedding, c.embedding) AS distance FROM courses ref JOIN courses c ON c.course_id <> ref.course_id WHERE ref.code = 'CS101' ORDER BY distance LIMIT 5;
Попробуйте прямо сейчас
Устанавливать ничего не нужно.
Запустить запросы к University DB можно прямо в браузере на sqlize.online - онлайн-редакторе SQL с поддержкой MariaDB 11.7. Скопируйте любой запрос из примеров и получите результат мгновенно.
Для структурированной практики с заданиями и проверкой ответов — sqltest.online.
Установка
Весь проект доступен под лицензией MIT:
? github.com/rozhnev/university-db
Что входит в репозиторий:
01_schema.sql— DDL всех 16 таблиц02_objects.sql— представления, процедуры, триггеры03_seed_small.sql— статические справочные данныеgenerate_data.py— Python-скрипт на Faker, генерирует ~130 000 строкdocker-compose.yml— одна команда для запускаqueries/level1.sql…level4.sql— 50+ примеров запросов
git clone https://github.com/rozhnev/university-db.git cd university-db cp .env.example .env # Отредактируйте .env - задайте пароли docker compose up --build
После старта MariaDB схема и справочные данные загрузятся автоматически, затем запустится генератор данных и заполнит транзакционные таблицы.
Как поучаствовать в проекте
Проект открытый, и любой вклад приветствуется. Вот что можно сделать:
Сообщить о проблеме - нашли ошибку в схеме, некорректный запрос или опечатку в комментарии? Откройте issue на GitHub. Чем конкретнее описание, тем быстрее разберёмся.
Предложить новый пример запроса - если вы написали интересный запрос к этой схеме и хотите поделиться, присылайте pull request в queries/. Особенно ценны примеры для уровней 3–4.
Улучшить генератор данных - generate_data.py намеренно оставлен простым. Можно сделать более реалистичные распределения оценок, добавить новые сценарии, ускорить генерацию через bulk-вставки.
Добавить скрипты для других инструментов - есть готовый Docker Compose, но можно добавить поддержку Kubernetes, Helm-чарт или скрипт для облачных managed-сервисов (RDS, Cloud SQL).
Перевести примеры запросов - комментарии в SQL-файлах сейчас только на английском; если хотите добавить комментарии на другом языке - welcome.
Написать учебные материалы - задачи с решениями, воркшопы, jupyter-ноутбуки - всё, что помогает изучать SQL на этой схеме.
Для начала достаточно сделать fork репозитория и отправить pull request. Код ревью проводится в течение нескольких дней.
Sakila мертва?
Нет. Это по-прежнему рабочая база для изучения базового SQL, а её портируемость на любой MySQL 5.x - настоящее преимущество. Но как основной обучающий инструмент для современной MariaDB она устарела.
University DB закрывает этот пробел - для всех, кто хочет преподавать или изучать SQL на полную мощь MariaDB 11.7: от первого SELECT до векторного поиска внутри рекурсивного CTE внутри хранимой процедуры.
Буду рад фидбеку, вопросам и pull request’ам.
Слава Рожнев - sqlize.online · sqltest.online · GitHub