Skip to content

Latest commit

 

History

History
221 lines (162 loc) · 15.6 KB

File metadata and controls

221 lines (162 loc) · 15.6 KB

Урок 1. Введение в базы данных

Что такое база данных

Когда мы пишем программу, которая что-то запоминает — список задач, пользователей, товары — данные нужно где-то хранить. Самый простой способ — переменная в памяти. Но как только программа завершается, всё исчезает.

Следующий шаг — файл. Можно записать данные в .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 — корпоративный сектор

Нереляционные базы данных (NoSQL)

Нереляционные БД хранят данные не в таблицах, а в других форматах — документах, парах ключ-значение, графах и так далее. Их объединяет одно: они отказываются от жёсткой табличной структуры ради гибкости или скорости.

Вы уже встречались с идеей нереляционного хранения — кэширование через словарь в 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

SQL (Structured Query Language, произносится "эс-кью-эл" или "сиквел") — это язык для работы с реляционными базами данных. С его помощью можно:

  • Получать данные — сделать выборку нужных записей
  • Добавлять данные — вставить новые строки
  • Изменять данные — обновить существующие записи
  • Удалять данные — убрать ненужные строки
  • Управлять структурой — создавать и изменять таблицы

SQL — это не язык программирования в привычном смысле. Это декларативный язык: вы описываете что хотите получить, а не как это получить. СУБД сама решает как выполнить запрос наиболее эффективно.

-- Обычный язык программирования (как): пройти по всем записям и отобрать нужные
-- SQL (что): дай мне имена пользователей, у которых город Москва
SELECT name FROM users WHERE city = 'Москва';

SQL стандартизирован — базовый синтаксис одинаков во всех реляционных СУБД. Небольшие отличия есть, но фундамент переносится между системами.


Почему мы начинаем с SQLite

В этом курсе мы работаем с 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    │
                    └──────────────────┘

С этой базой данных мы будем работать на протяжении всего первого модуля.


Вопросы

  1. Чем база данных принципиально отличается от хранения данных в файле формата JSON?
  2. Что такое СУБД и чем она отличается от самой базы данных?
  3. В чём ключевое отличие реляционных баз данных от нереляционных?
  4. Приведите пример из вашего опыта в Python, который напоминает принцип работы хранилища ключ-значение (Redis).
  5. Что означает слово "декларативный" применительно к SQL?
  6. Почему в таблице реляционной БД у каждой строки должен быть первичный ключ?
  7. Что такое схема базы данных?
  8. Перечислите не менее трёх причин, почему в этом курсе мы начинаем именно с SQLite, а не с PostgreSQL.
  9. Посмотрите на схему базы интернет-магазина. Почему данные о заказе разделены на две таблицы — orders и order_items?
  10. В каком случае для проекта стоит рассмотреть использование двух разных баз данных одновременно? Приведите пример.

Следующий урок