惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
Почему не Sakila? Создаём современную учебную базу данных...
rozhnev · 2026-06-27 · via Все публикации подряд на Хабре

Простой

5 мин

0

Если вы когда-либо преподавали 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 и вектора.

Университет подходит идеально. Студенты, курсы, преподаватели, зачисления, оценки — каждый прожил внутри этой системы. Связи интуитивны. А предметная область естественным образом порождает именно те структуры данных, которые нужны для обучения:

Требование

Что есть в университете

Большая аналитическая таблица

grade_events — 120 000+ строк оценок

Иерархия для рекурсивного 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.sqllevel4.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