База данных — это просто организованное хранилище информации. Как шкаф с папками: каждая папка — тема, внутри — листы с записями. Только вместо папок — файлы на сервере, а вместо библиотекаря — система управления, которая мгновенно находит нужное.
Без баз данных придётся хранить информацию в текстовых файлах, таблицах или «в голове». Это медленно, ненадёжно и масштабируется плохо.
Представьте, что вы ведёте журнал оценок в тетради. Всё работает, пока студентов 20. А когда их 20 000? А когда нужны оценки по 50 предметам? А когда родитель хочет посмотреть средний балл за семестр? Тетрадь ломается. База данных — это тетрадь, которая не ломается никогда, потому что за неё отвечает компьютерная программа (СУБД — система управления базой данных), которая умеет искать, считать, обновлять и защищать данные.
Все данные в одном месте. Нет дублей в разных файлах, нет «версий правды». Один источник информации, доступный всем нужным программам.
Вместо «перелистывания страниц» — мгновенный запрос: «Найди всех студентов с оценкой 5 по алгебре». Даже среди миллионов записей — результат за миллисекунды.
База данных умеет разрешать доступ одним и запрещать другим. Например, преподаватель видит все оценки, а студент — только свои. Плюс автоматическое резервное копирование.
От 10 записей до 10 миллиардов — база данных работает одинаково. Нужно больше — просто добавляешь сервер. Файловая система так не умеет.
Самый популярный и понятный тип баз данных. Данные хранятся в таблицах, которые связаны между собой — отсюда слово «реляционные» (от англ. relation — связь).
Откройте Excel. Вот таблица «Студенты»: столбцы — ID, Имя, Группа, Email. Каждая строка — один студент. Теперь вторая таблица — «Оценки»: ID оценки, ID студента, Предмет, Оценка, Дата. Таблицы связаны через ID студента — это как номер страницы в оглавлении. Зная ID, база данных мгновенно «подтягивает» все оценки нужного студента.
| ID | Имя | Группа | |
|---|---|---|---|
| 1 | Алексей Смирнов | ИТ-21 | alex@mail.ru |
| 2 | Мария Иванова | ИТ-21 | maria@mail.ru |
| 3 | Дмитрий Козлов | ИТ-22 | dmitry@mail.ru |
Таблица = совокупность записей с одинаковой структурой. Столбец задаёт тип данных (число, текст, дата), а строка — одну конкретную запись. Удобно, наглядно, привычно.
СтруктураПервичный ключ (PK) — уникальный номер каждой строки (как паспорт). Внешний ключ (FK) — номер из другой таблицы (как ссылка). Именно через ключи таблицы «понимают» друг друга.
Связи
SQL (Structured Query Language) — язык общения с базой. Запрос
SELECT * FROM студенты WHERE группа = 'ИТ-21'
означает: «Дай всех студентов из группы ИТ-21». Читается почти как английское предложение.
Один-к-одному (1:1) — каждый студент имеет один паспорт,
каждый паспорт принадлежит одному студенту.
Один-ко-многим (1:N) — один преподаватель ведёт несколько групп,
но каждая группа у одного преподавателя.
Многие-ко-многим (M:N) — студенты посещают множество предметов,
и на одном предмете много студентов. Для такой связи нужна промежуточная таблица.
SELECT имя, оценка FROM оценки WHERE предмет = 'Математика' — покажи имена и оценки по математике.
INSERT INTO студенты (имя, группа) VALUES ('Ольга', 'ИТ-22') — добавь новую студентку Ольгу в группу ИТ-22.
UPDATE оценки SET оценка = 5 WHERE id = 12 — измени оценку записи с номером 12 на пятёрку.
DELETE FROM студенты WHERE id = 3 — удали запись о студенте с номером 3.
SELECT * FROM студенты JOIN оценки ON студенты.id = оценки.student_id — покажи студентов вместе с их оценками.
Атомарность — транзакция выполняется целиком или не выполняется вовсе.
Перевод 5000 ₽: деньги списались и зачислились одновременно, иначе откат.
Согласованность — после транзакции база остаётся в корректном состоянии.
Баланс не может стать отрицательным.
Изоляция — параллельные транзакции не мешают друг другу.
Два человека одновременно снимают деньги — каждый видит свою версию.
Долговечность — после подтверждения транзакция сохраняется даже при
отключении питания.
Когда данные не влезают в таблицы — слишком разные, слишком быстрые или слишком большие — на помощь приходят NoSQL базы. «NoSQL» не значит «без SQL», а скорее «не только SQL».
Реляционная база — как шкаф с одинаковыми ящиками. NoSQL — как комната, где можно поставить шкаф, коробку, мешок или что угодно. Не нужно заранее решать структуру — можно начать хранить данные, а структуру «доращивать» по мере необходимости. Это особенно удобно в больших проектах (соцсети, онлайн-игры, IoT-устройства), где данные приходят быстрее, чем вы успеваете проектировать схему.
Данные хранятся как документы (обычно JSON). У каждого документа может быть своя структура. Пример: MongoDB. Идеально для каталогов товаров, блогов, профилей пользователей — где у каждого объекта набор полей свой.
JSON-документыСамый простой тип: каждому значению присваивается ключ, как слово в словаре. Знаешь ключ — получаешь значение мгновенно. Пример: Redis. Используют для кэширования, сессий, счётчиков лайков — везде, где нужна скорость.
Максимальная скоростьДанные как сеть: узлы (люди, статьи, товары) и связи между ними (дружит, ссылается, купил). Пример: Neo4j. Идеальны для соцсетей, рекомендаций, навигации — везде, где важны связи «кто с кем дружит».
СвязиПохожи на таблицы, но столбцы не обязательны для каждой строки. Каждая строка может иметь свой набор столбцов. Пример: Cassandra. Используют для аналитики больших данных — логов, телеметрии, истории.
Большие объёмыПредставьте таблицу, где в одной колонке «Студент» записано «Иванов;Петров;Сидоров». А в колонке «Предмет» — «Математика;Физика;Информатика». Это антитон нормализации. Нормализация — процесс превращения одного огромного беспорядка в несколько маленьких аккуратных таблиц, связанных ключами. Цель: одно значение — одно место хранения. Если Иванов поменял фамилию, меняем её в одном месте, а не в тысяче записей.
Каждая ячейка таблицы содержит только одно значение. Никаких списков внутри ячеек: «Математика, Физика» — нельзя. Нужна отдельная строка для каждого предмета. Атомарность данных.
АтомарностьВсе неключевые поля зависят от всего первичного ключа, а не от его части. Если PK — составной (ID студента + ID предмета), то оценка зависит от пары, но имя студента — только от ID студента. Имя нужно вынести в отдельную таблицу.
Полная зависимостьНет транзитивных зависимостей. Если у группы есть «Факультет», а у факультета — «Декан», то не храните декана в таблице групп. Вынесите факультеты отдельно. Каждое поле зависит только от ключа — ни от чего лишнего.
Чистота связейКогда вы ищете слово в книге без оглавления — читаете страница за страницей (это полный перебор). Индекс — это оглавление. Без него поиск по миллиону записей занимает секунды; с индексом — миллисекунды. Стоимость: индекс занимает дополнительное место на диске и немного замедляет добавление новых записей (нужно обновлять оглавление). Но для частых запросов выгода колоссальная.
Самый частый тип индекса. Данные упорядочены, как страницы в телефонной книге. Поиск, диапазоны, сортировка — всё работает быстро. Используется по умолчанию в большинстве СУБД (PostgreSQL, MySQL, Oracle).
Быстрое точное совпадение: «Найди запись с email = test@mail.ru».
Работает мгновенно (O(1)), но не умеет выделять диапазоны и сортировать.
Идеален для ключей кэша и session ID.
Индекс для поиска по тексту: «найди все статьи, где упоминается "база данных"». Понимает морфологию, стоп-слова, релевантность. Используется в поисковиках, блогах, CRM.
Запрос к базе данных — как вопрос библиотекарю. Плохой вопрос: «Дай мне все книги». Хороший вопрос: «Дай мне все книги по математике, изданные после 2020 года, в твёрдой обложке». Чем точнее запрос — тем быстрее ответ. Оптимизация — это искусство задавать правильные вопросы и помогать базе данных отвечать быстро.
Команда EXPLAIN SELECT ... показывает, как база выполняет
запрос: какой индекс использует, сколько строк сканирует. Это как посмотреть
маршрут навигатора перед поездкой.
Часто запрашиваемые данные сохраняются в быстрой памяти (Redis/Memcached). Первый запрос — к базе, далее — из кэша. Ускорение в 100–1000 раз для статичных данных (например, страница товара в каталоге).
Скорость ×1000Репликация: копии базы на разных серверах — читают все, записывает мастер. Увеличивает отказоустойчивость. Шардирование: база делится на «осколки» по признаку (город, дата). Каждый осколок обслуживает свой сервер.
МасштабированиеСоздание соединения с базой — дорогая операция (аутентификация, шифрование). Пул бережёт готовые соединения и раздаёт их по запросу. Экономит время и ресурсы сервера при тысячах одновременных пользователей.
ЭффективностьНа практике вы столкнётесь с несколькими системами. Вот основные.
Мощная open-source СУБД. Поддерживает JSON, GIS, полнотекстовый поиск, триггеры, витрины данных. Фаворит стартапов и enterprise. «Ормезон» реляционных баз — надёжный и гибкий.
SQLСамая популярная в мире СУБД. Простая, быстрая, проверенная. WordPress, YouTube, Facebook начали с MySQL. Идеальна для веб-приложений, где скорость чтения важнее сложных транзакций.
SQLЛидер среди документоориентированных. Хранит JSON-документы (BSON). Горизонтальное масштабирование из коробки. Идеален для каталогов, логов, мобильных бэкендов.
NoSQLХранилище ключ-значение в оперативной памяти. Микросекундные операции. Кэш, сессии, очереди, лимитеры запросов. Не замена базы данных, но идеальный компаньон.
Кэш