Когда мы пишем программу, которая что-то запоминает — список задач, пользователей, товары — данные нужно где-то хранить. Самый простой способ — переменная в памяти. Но как только программа завершается, всё исчезает.
Следующий шаг — файл. Можно записать данные в .txt, .json или .csv. Это уже лучше: данные сохраняются между запусками. Но как только данных становится много, начинаются проблемы:
- Как найти нужную запись среди тысяч?
- Как изменить одно поле, не перезаписывая весь файл?
- Что если два пользователя пытаются изменить данные одновременно?
- Как связать данные из разных файлов между собой?
Именно для решения этих проблем существуют базы данных — специализированные системы для хранения, поиска, изменения и управления данными.
База данных (БД) — это организованная коллекция данных, которой управляет специальная программа — система управления базами данных (СУБД).
Разница между "просто файлом" и базой данных:
| Файл (JSON, CSV) | База данных |
|---|---|
| Нет структурированного поиска | Быстрый поиск по любому полю |
| Перезапись всего файла при изменении | Изменение только нужной записи |
| Нет контроля одновременного доступа | Управление параллельными запросами |
| Нет связей между файлами | Встроенные механизмы связи данных |
| Нет проверки корректности данных | Ограничения и валидация на уровне схемы |
Баз данных существует много. Но все их можно разделить на два больших класса: реляционные и нереляционные.
Реляционная БД хранит данные в виде таблиц — строк и столбцов, как в Excel, только гораздо мощнее. Таблицы могут быть связаны между собой.
Пример: таблица users и таблица orders. Каждый заказ знает, какому пользователю он принадлежит. Это и есть "реляция" — связь.
Таблица: users Таблица: orders
┌────┬──────────┐ ┌────┬──────────┬─────────┐
│ id │ name │ │ id │ user_id │ total │
├────┼──────────┤ ├────┼──────────┼─────────┤
│ 1 │ Alice │ │ 1 │ 1 │ 1500.00 │
│ 2 │ Bob │ │ 2 │ 1 │ 320.00 │
│ 3 │ Carol │ │ 3 │ 2 │ 750.00 │
└────┴──────────┘ └────┴──────────┴─────────┘
Для работы с реляционными БД используется язык SQL (Structured Query Language).
Популярные реляционные СУБД:
- SQLite — лёгкая, файловая, идеальна для обучения и небольших проектов
- PostgreSQL — мощная, используется в продакшне большинства веб-проектов
- MySQL / MariaDB — широко распространена в веб-разработке
- Microsoft SQL Server — корпоративный сектор
Нереляционные БД хранят данные не в таблицах, а в других форматах — документах, парах ключ-значение, графах и так далее. Их объединяет одно: они отказываются от жёсткой табличной структуры ради гибкости или скорости.
Вы уже встречались с идеей нереляционного хранения — кэширование через словарь в Python. Ключ → значение, быстрый доступ, никакой структуры таблиц. Redis работает ровно по этому принципу, только как полноценная система.
Основные типы NoSQL:
Документные — данные хранятся в виде JSON-подобных документов. Каждый документ может иметь свою структуру.
{
"id": 1,
"name": "Alice",
"orders": [
{"total": 1500, "items": ["ноутбук"]},
{"total": 320, "items": ["мышь", "коврик"]}
]
}Пример: MongoDB
Ключ-значение — максимально простая структура, максимальная скорость. Используется для кэша, сессий, очередей.
"session:abc123" → {"user_id": 1, "expires": "2024-12-01"}
Пример: Redis
Графовые — данные хранятся как узлы и связи между ними. Идеально для социальных сетей, рекомендаций. Пример: Neo4j
Колоночные — данные хранятся по столбцам, а не по строкам. Эффективны для аналитики над большими объёмами. Пример: Apache Cassandra
| Ситуация | Выбор |
|---|---|
| Веб-приложение с чёткой структурой данных | Реляционная БД |
| Нужны гибкие документы с разной структурой | MongoDB |
| Кэширование, сессии, очереди | Redis |
| Социальный граф, рекомендации | Neo4j |
| Аналитика петабайт данных | Cassandra / BigQuery |
На практике в одном проекте часто используют несколько баз одновременно: PostgreSQL для основных данных, Redis для кэша и сессий.
SQL (Structured Query Language, произносится "эс-кью-эл" или "сиквел") — это язык для работы с реляционными базами данных. С его помощью можно:
- Получать данные — сделать выборку нужных записей
- Добавлять данные — вставить новые строки
- Изменять данные — обновить существующие записи
- Удалять данные — убрать ненужные строки
- Управлять структурой — создавать и изменять таблицы
SQL — это не язык программирования в привычном смысле. Это декларативный язык: вы описываете что хотите получить, а не как это получить. СУБД сама решает как выполнить запрос наиболее эффективно.
-- Обычный язык программирования (как): пройти по всем записям и отобрать нужные
-- SQL (что): дай мне имена пользователей, у которых город Москва
SELECT name FROM users WHERE city = 'Москва';SQL стандартизирован — базовый синтаксис одинаков во всех реляционных СУБД. Небольшие отличия есть, но фундамент переносится между системами.
В этом курсе мы работаем с SQLite. Вот почему:
- Не требует установки сервера — вся база данных это один файл на диске
- Встроена в Python — модуль
sqlite3входит в стандартную библиотеку - Идеальна для обучения — ноль настройки, максимум практики
- Реально используется — Django по умолчанию использует SQLite для разработки
SQLite — это полноценная реляционная БД с поддержкой SQL. Всё что вы научитесь здесь, перенесётся на PostgreSQL без переучивания. Синтаксис запросов практически идентичен.
Прежде чем писать запросы, нужно понять с чем именно мы работаем.
Основная единица хранения данных. Имеет фиксированные столбцы (колонки) и хранит строки (записи).
Таблица: products
┌────┬──────────────────┬──────────┬───────────┐
│ id │ name │ price │ category │
├────┼──────────────────┼──────────┼───────────┤
│ 1 │ Ноутбук Lenovo │ 75000.00 │ Электрон. │
│ 2 │ Мышь Logitech │ 2500.00 │ Электрон. │
│ 3 │ Стол компьют. │ 15000.00 │ Мебель │
└────┴──────────────────┴──────────┴───────────┘
- Столбец (column) — определённый атрибут: имя, цена, категория. У каждого столбца есть тип данных.
- Строка (row / record) — одна запись: конкретный товар со всеми его атрибутами.
- Ячейка (cell) — значение на пересечении строки и столбца.
Каждая таблица обычно имеет столбец id — первичный ключ (PRIMARY KEY). Это уникальный идентификатор строки. Никакие две строки не могут иметь одинаковый id. Благодаря первичному ключу можно однозначно обратиться к любой записи.
Схема — это описание структуры БД: какие есть таблицы, какие в них столбцы, какие типы данных, как таблицы связаны между собой. Схема — это "чертёж" базы данных.
В нашем курсе мы будем работать с базой данных интернет-магазина. Её схема выглядит так:
categories products users
┌──────────┐ ┌──────────────────┐ ┌──────────────┐
│ id │◄───────│ category_id │ │ id │
│ name │ │ id │ │ name │
└──────────┘ │ name │ │ email │
│ price │ │ city │
│ stock │ └──────┬───────┘
└──────────────────┘ │
│
orders │
┌──────────────────┐ │
│ id │ │
│ user_id │◄────────────┘
│ created_at │
│ status │
└────────┬─────────┘
│
order_items
┌──────────────────┐
│ id │
│ order_id │◄────┘
│ product_id │
│ quantity │
│ price_at_time │
└──────────────────┘
С этой базой данных мы будем работать на протяжении всего первого модуля.
- Чем база данных принципиально отличается от хранения данных в файле формата JSON?
- Что такое СУБД и чем она отличается от самой базы данных?
- В чём ключевое отличие реляционных баз данных от нереляционных?
- Приведите пример из вашего опыта в Python, который напоминает принцип работы хранилища ключ-значение (Redis).
- Что означает слово "декларативный" применительно к SQL?
- Почему в таблице реляционной БД у каждой строки должен быть первичный ключ?
- Что такое схема базы данных?
- Перечислите не менее трёх причин, почему в этом курсе мы начинаем именно с SQLite, а не с PostgreSQL.
- Посмотрите на схему базы интернет-магазина. Почему данные о заказе разделены на две таблицы —
ordersиorder_items? - В каком случае для проекта стоит рассмотреть использование двух разных баз данных одновременно? Приведите пример.