1. Введение в реляционные базы данных
Введение в реляционные базы данных
Любое современное приложение — от простого списка задач на смартфоне до глобальной социальной сети — построено вокруг данных. Пользователи регистрируются, добавляют товары в корзину, ставят лайки и оставляют комментарии. Вся эта информация должна где-то надежно храниться, быстро обновляться и мгновенно выдаваться по запросу. Для решения этих задач инженеры используют специализированные системы, изучение которых мы начинаем в этом курсе.
От электронных таблиц к базам данных
Когда мы говорим о хранении данных в виде таблиц, первой ассоциацией часто становится Microsoft Excel или Google Таблицы. Для личного использования или небольшого бизнеса это отличные инструменты. Однако, когда речь заходит о разработке программного обеспечения, обычные файлы перестают справляться.
Представьте, что вы создаете интернет-магазин. В первый месяц у вас 100 клиентов и 50 товаров. Вы можете вести учет в Excel. Но через год у вас 100 000 клиентов, каждый из которых делает по несколько заказов в месяц.
Обычные электронные таблицы имеют физические ограничения (например, в Excel максимум 1 048 576 строк). Кроме того, если два менеджера одновременно попытаются изменить один и тот же файл, возникнет конфликт версий. А если приложение должно искать конкретный заказ среди миллионов записей, чтение файла от начала до конца займет недопустимо много времени.
Здесь на сцену выходят базы данных (БД) — структурированные массивы информации, организованные таким образом, чтобы компьютер мог максимально быстро находить и обрабатывать нужные фрагменты.
Сама по себе база данных — это просто набор файлов на жестком диске сервера. Чтобы с ними работать, нужна система управления базами данных (СУБД). Это сложная программа, которая берет на себя всю черновую работу: она записывает данные на диск, распределяет оперативную память, управляет одновременным доступом тысяч пользователей и защищает информацию от сбоев.
В рамках нашего курса мы будем работать с двумя мощнейшими промышленными СУБД: PostgreSQL (открытая и бесплатная система, стандарт де-факто в современной веб-разработке) и SQL Server (коммерческая система от Microsoft, широко используемая в корпоративном секторе).
Анатомия реляционной модели
Существуют разные подходы к хранению данных, но самым популярным и надежным остается реляционный подход. Термин реляционная база данных происходит от английского слова relation (отношение). В математике и теории баз данных под «отношением» понимается то, что мы в быту привыкли называть таблицей.
В реляционной БД вся информация строго структурирована и хранится в двумерных таблицах. Каждая таблица описывает только одну сущность реального мира.
Структура таблицы состоит из двух главных элементов: * Столбцы (атрибуты) — задают структуру данных. Например, в таблице клиентов могут быть столбцы «Имя», «Email» и «Дата регистрации». Для каждого столбца жестко задается тип данных: нельзя записать текст в столбец, предназначенный для чисел. * Строки (записи) — содержат сами данные. Одна строка — это один конкретный экземпляр сущности (один клиент, один товар, один заказ).
Проблема дублирования данных
Чтобы понять главную силу реляционных баз, рассмотрим частую ошибку новичков — попытку хранить всё в одной огромной таблице.
Допустим, мы записываем все продажи в одну таблицу. В ней есть столбцы: Номер заказа, Имя клиента, Адрес клиента, Название товара, Цена товара.
Если клиент Иван Иванов с адресом «г. Москва, ул. Пушкина, д. 10» сделает 50 разных заказов за год, его имя и длинный адрес будут скопированы в таблице 50 раз.
Это порождает три критические проблемы:
Реляционная модель решает эту проблему элегантно: мы разбиваем данные на несколько независимых таблиц и связываем их между собой.
Ключи и связи: как таблицы общаются друг с другом
Вместо одной большой таблицы мы создадим три маленькие: «Клиенты», «Товары» и «Заказы». Но как системе понять, какой клиент какой товар купил? Для этого используются ключи.
Первичный ключ (Primary Key, PK) — это уникальный идентификатор строки в таблице. Чаще всего это просто порядковый номер (ID), который база данных генерирует автоматически. У каждого клиента есть свой уникальный ID, который никогда не меняется и не повторяется.
Внешний ключ (Foreign Key, FK) — это столбец в одной таблице, который ссылается на первичный ключ в другой таблице.
Посмотрим на конкретный пример с числами.
Таблица «Клиенты»: | ID клиента (PK) | Имя | Адрес | | :--- | :--- | :--- | | 1 | Иван Иванов | Москва, ул. Пушкина | | 2 | Анна Смирнова | Казань, ул. Баумана |
Таблица «Товары»: | ID товара (PK) | Название | Цена (руб.) | | :--- | :--- | :--- | | 101 | Ноутбук | 80000 | | 102 | Мышь | 1500 |
Таблица «Заказы»: | ID заказа (PK) | ID клиента (FK) | ID товара (FK) | Количество | | :--- | :--- | :--- | :--- | | 5001 | 1 | 102 | 2 | | 5002 | 2 | 101 | 1 |
В таблице «Заказы» мы больше не пишем имена и адреса. Мы используем только числа (ID). Заказ №5001 говорит нам: клиент с ID=1 (Иван) купил товар с ID=102 (Мышь) в количестве 2 штук.
Если Иван переедет, мы изменим его адрес ровно в одном месте — в строке №1 таблицы «Клиенты». Все его прошлые и будущие заказы автоматически будут связаны с новым адресом, так как они ссылаются на его ID.
Общее количество связей в базе может быть огромным. Если у нас 10 000 пользователей и каждый делает в среднем по 5 заказов, таблица заказов будет содержать записей, но при этом ни один байт личной информации не будет продублирован.
!Схема реляционной базы данных интернет-магазина
Иерархия объектов в базе данных
Чтобы не запутаться в тысячах таблиц, современные СУБД используют строгую иерархию хранения. Представьте себе матрешку:
ecommerce_app для магазина и база hr_system для отдела кадров. Они полностью независимы.inventory для таблиц склада и схема sales для таблиц продаж. По умолчанию в PostgreSQL все таблицы создаются в стандартной схеме public.Понимание этой структуры критически важно, так как при написании запросов вам часто придется указывать точный путь к данным.
Язык SQL: как разговаривать с базой
СУБД не понимает человеческий язык. Чтобы попросить ее создать таблицу, добавить данные или найти нужного клиента, используется SQL (Structured Query Language — язык структурированных запросов).
SQL — это стандартный язык для всех реляционных баз данных. Выучив его основы, вы сможете работать и с PostgreSQL, и с SQL Server, и с MySQL.
Все операции в базах данных сводятся к четырем базовым действиям, которые программисты называют аббревиатурой CRUD:
* Create (Создание) — добавление новых строк (оператор INSERT).
* Read (Чтение) — поиск и извлечение данных (оператор SELECT).
* Update (Обновление) — изменение существующих данных (оператор UPDATE).
* Delete (Удаление) — стирание данных (оператор DELETE).
Например, чтобы найти всех клиентов из Москвы, мы напишем запрос, который читается почти как обычное английское предложение:
DBeaver: ваш пульт управления
Исторически администраторы работали с базами данных через черное окно терминала, вводя команды текстом. Это мощный, но не самый наглядный способ.
В нашем курсе мы будем использовать DBeaver — универсальный графический интерфейс (GUI) для работы с базами данных.
DBeaver подключается к вашему серверу PostgreSQL или SQL Server и отображает всю сложную иерархию (базы, схемы, таблицы) в виде удобного дерева папок слева на экране.
С помощью DBeaver вы сможете: * Просматривать содержимое таблиц в виде сетки, похожей на Excel. * Писать SQL-запросы в удобном редакторе с подсветкой синтаксиса и автодополнением (программа сама подскажет названия таблиц). * Автоматически строить визуальные схемы связей между таблицами (ER-диаграммы). * Импортировать данные из обычных CSV-файлов прямо в таблицы базы данных.
Использование графического интерфейса не отменяет необходимости знать SQL. DBeaver — это лишь удобный инструмент, который ускоряет рутинные задачи, но логику извлечения и анализа данных вам предстоит описывать самостоятельно с помощью кода.