# ITMO DB Lesson 1

19 slides, by Olga1507Rub. https://easeweb.host/movie/lesson-1/1/

## Slide 1. Базы Данных
(id 145, https://easeweb.host/movie/lesson-1/1/)
- Базы Данных
- Читает: Святослав Санеев

## Slide 2. Знакомство
(id 146, https://easeweb.host/movie/lesson-1/2/)
- Знакомство
- • Я (по желанию\личной инициативе)
  • Что уже знаю про бд кратко(какие использую в своем проекте)
  • Что жду(не жду)

## Slide 3. Обо мне
(id 147, https://easeweb.host/movie/lesson-1/3/)
- [picture: Леста Игры - Школа анимации]
- Обо мне
- • Data Engineer Январь 2023 — сейчас (3 года и 8 месяцев)
- [picture]

## Slide 4. Как будут проходить занятия
(id 148, https://easeweb.host/movie/lesson-1/4/)
- Как будут проходить занятия
- • Камера? — можно оставаться за аватаром (*но если вы очень красивый — нежелательно)
  • Микрофон? — если молчите, лучше выключать.
  • Что при себе необходимо иметь? — из обязательного: себя.
  • Срач в чате? (в пределах разумного)

## Slide 5. Структура курса
(id 149, https://easeweb.host/movie/lesson-1/5/)
- Структура курса
- Хранилища данных
- Администрирование
- Запросы, агрегация, аналитика

## Slide 6. Система оценивания
(id 150, https://easeweb.host/movie/lesson-1/6/)
- Система оценивания
- • Аргументированное обоснование архитектуры в итоговом игровом проекте
  • Общее понимание курса(база)

## Slide 7. Базы данных
(id 151, https://easeweb.host/movie/lesson-1/7/)
- Базы данных
- Основные понятия. Классификация СУБД и критерии выбора

## Slide 8. Что СУБД берёт на себя?
(id 152, https://easeweb.host/movie/lesson-1/8/)
- Что СУБД берёт на себя?
- Хранение
  Размещение данных, буферизация, индексы
- Целостность
  Ограничения не дают записать неверные данные
- Язык запросов
  SQL: описываем, что нужно получить, а план выполнения выбирает СУБД
- Транзакции
  Группа операций выполняется целиком или не выполняется
- Конкурентность
  Клиенты пишут данные одновременно
- Восстановление
  Журнал изменений и резервные копии

## Slide 9. Типы хранилищ данных
(id 153, https://easeweb.host/movie/lesson-1/9/)
- Типы хранилищ данных
- [card] Relational Таблицы и связи PostgreSQL · R -> slide 10 "Реляционные СУБД"
- [card] Document-oriented JSON-документы MongoDB · D -> slide 12 "Документоориентированные"
- [card] Key-Value Ключ - значение Redis · KV -> slide 14 "Key-value хранилища"
- [card] Column-Oriented Аналитика ClickHouse · C -> slide 16 "Колоночные"

## Slide 10. Реляционные СУБД
(id 154, https://easeweb.host/movie/lesson-1/10/)
- R
- Реляционные СУБД
- Модель данных:
  Таблицы со строками и столбцами, связи между таблицами по ключам
- Сильные стороны:
  • строгая целостность
  • полноценные транзакции
  • произвольные запросы
- Ограничения:
  • общая схема
  • вся запись идёт в один узел
  • горизонтальное масштабирование сложнее и дороже
- Аккаунты, прогресс, инвентарь, внутриигровая экономика — всё, что нельзя потерять и что должно быть согласованным
- [picture]

## Slide 11. Покупка предмета за валюту
(id 155, https://easeweb.host/movie/lesson-1/11/)
- R
- Покупка предмета за валюту
- [button "→ зан. 2: price_paid"] -> presentation "ITMO DB lesson 2" (lesson-2)
- [button "→ зан. 3: транзакции"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- players
  player_id PK
  nickname level balance
  items
  item_id PK
  name price
  purchases
  purchase_id PK
  player_id > players
  item_id > items
  price_paid bought_at
  https://dbdiagram.io/d/6a9829aa5450bea1bece2959
- BEGIN;
  UPDATE players SET balance = balance - 100
  WHERE player_id = 1 AND balance >= 100;
  -- если 0 строк — денег не хватило, откатываем
  INSERT INTO purchases (player_id, item_id, price_paid, bought_at) VALUES (1, 5, 100, now());
  COMMIT;
- Здесь деньги игрока: две таблицы обязаны измениться вместе или не измениться вовсе.
- [picture]

## Slide 12. Документоориентированные
(id 156, https://easeweb.host/movie/lesson-1/12/)
- D
- Документоориентированные
- [button "→ зан. 3: MongoDB"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- Модель данных:
  Документы в формате JSON/BSON, сгруппированные в коллекции
- Сильные стороны:
  • разнородные сущности
  • вложенные структуры читаются вместе, без соединений
  • новое поле без ALTER TABLE (но код и validator обновлять нужно)
- Ограничения:
  • связи поддерживает приложение
  • риск рассогласованных данных
  • запросы через несколько коллекций дороже, чем JOIN
- Конфигурация предметов и эффектов, описания ивентов, профили с разным набором полей у разных типов персонажей

## Slide 13. Каталог игровых предметов с ра
(id 157, https://easeweb.host/movie/lesson-1/13/)
- [button "→ зан. 3: варианты каталога"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- D
- Каталог игровых предметов с разными атрибутами
- [button "→ зан. 3: схема и validator"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- {
  "_id": "sword_dawn",
  "type": "weapon",
  "name": "Клинок зари",
  "damage": 45,
  "slots": ["main_hand"]
  },
  {
  "_id": "potion_heal_s",
  "type": "potion",
  "name": "Малое лечение",
  "heal": 120,
  "stackable": true
  }
- use game_db;
  db.items.insertOne({ _id: "sword_dawn", type: "weapon", name: "Клинок зари", damage: 45, slots: ["main_hand"] });
  db.items.insertOne({ _id: "potion_heal_s", type: "potion", name: "Малое лечение", heal: 120, stackable: true });
  db.items.find({ _id: "sword_dawn" });
- Набор атрибутов у каждого типа предмета свой и меняется каждый спринт — документ выражает это естественно. Пример модели, а не решение за проект: сравнение с jsonb — на занятии 3.

## Slide 14. Key-value хранилища
(id 158, https://easeweb.host/movie/lesson-1/14/)
- KV
- Key-value хранилища
- [button "→ зан. 3: типы Redis"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- [button "→ зан. 3: TTL"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- Модель данных:
  Ключ и связанное с ним значение, данные держатся в оперативной памяти
- Сильные стороны:
  • низкая задержка отклика
  • ключ удаляется сам по истечении TTL (срок задают явно)
  • готовые структуры
- Ограничения:
  • не источник истины: память дороже и её меньше
  • нет произвольных запросов по содержимому значений
- Рейтинг пересчитывается после каждого матча, а верхушку читают тысячи раз в секунду.

## Slide 15. Лидерборд и очередь матчмейкера
(id 159, https://easeweb.host/movie/lesson-1/15/)
- KV
- Лидерборд и очередь матчмейкера
- [button "→ зан. 3: лидерборд"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- leaderboard:season:12
  sorted set score очки игрока
  КЛЮЧ: leaderboard:season:12
  ЗНАЧЕНИЕ: sorted set { player_42: 4750, player_7: 3390,...}
  —------------------------------------------------------
  matchmaking:queue:ranked
  list очередь ожидания
- ZADD leaderboard:season:12 4750 player_42
  ZRANGE leaderboard:season:12 0 99 REV
  1) player_1042 2) player_42 3) player_7 …
  (ZREVRANGE устарел с Redis 6.2)
  ZREVRANK leaderboard:season:12 player_42
  место с нуля; nil — игрока нет
  —------------------------------------------------------
  (FIFO-очередь)
  RPUSH matchmaking:queue:ranked player_42
  LPOP matchmaking:queue:ranked
- Рейтинг пересчитывается после каждого матча, а верхушку читают тысячи раз в секунду

## Slide 16. Колоночные
(id 160, https://easeweb.host/movie/lesson-1/16/)
- C
- Колоночные
- Модель данных:
  Данные хранятся по столбцам, а не по строкам
- Сильные стороны:
  • агрегаты по сотням миллионов строк
  • высокая степень сжатия
  • читаются только те столбцы, что нужны запросу
- Ограничения:
  • точечные обновления и удаления неудобны и дороги
  • не предназначено для оперативных транзакций
- Телеметрия и события, аналитика, результаты A/B-тестов и тд

## Slide 17. Аналитика событий за день
(id 161, https://easeweb.host/movie/lesson-1/17/)
- C
- Аналитика событий за день
- CREATE TABLE events (
  ts DateTime,
  player_id UInt64,
  event_name LowCardinality(String),
  level UInt16,
  params String )
  ENGINE = MergeTree
  PARTITION BY toYYYYMM(ts)
  ORDER BY (event_name, ts);
  -- десятки млн строк в сутки, запись пачками
- SELECT toDate(ts) AS d,
  count() AS purchases,
  uniq(player_id) AS payers
  FROM events WHERE event_name = 'purchase' AND ts >= '2026-08-01' GROUP BY d ORDER BY d
- Пишем очень много, точечные обновления событий не нужны

## Slide 18. КРИТЕРИИ ВЫБОРА
(id 162, https://easeweb.host/movie/lesson-1/18/)
- КРИТЕРИИ ВЫБОРА
- [button "→ зан. 3: граница хранилищ"] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- Что за данные
- Цена ошибки
- Нагрузка
- Однородные и связанные?
- Можно ли потерять запись?
- Точечные операции по одному игроку?
- Задержка
- Изменчивость схемы
- Объём и рост
- Десятки миллисекунд?
- Структура не меняется?
- Сейчас и через год?
- Название конкретной СУБД появляется только после ответов на эти шесть вопросов, а не наоборот, когда технология выбрана заранее.

## Slide 19. Итого
(id 163, https://easeweb.host/movie/lesson-1/19/)
- Итого
- [button "Далее: занятие 2 →"] -> presentation "ITMO DB lesson 2" (lesson-2)
- [picture]
- [picture]
- Полиглотное хранение - ok
- [picture]
- Выбор идёт от задачи
- В боевом проекте несколько СУБД работают вместе, каждая на своей задаче
- Сначала характер данных, цена ошибки и профиль нагрузки — потом название СУБД
- [picture]
- [picture]
- Гибкость всегда оплачивается -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- [shape] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- Один источник истины -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- [shape] -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- Остальные хранилища производны от него и должны переживать свою потерю -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
- Отказ от схемы возвращается ручной проверкой целостности в коде приложения -> presentation "ITMO DB lesson 3" (itmo-db-lesson-3)
