Введение в реляционные базы данных
Введение в реляционные базы данных
Любое современное приложение — от простого списка задач на смартфоне до глобальной социальной сети — построено вокруг данных. Пользователи регистрируются, добавляют товары в корзину, ставят лайки и оставляют комментарии. Вся эта информация должна где-то надежно храниться, быстро обновляться и мгновенно выдаваться по запросу. Для решения этих задач инженеры используют специализированные системы, изучение которых мы начинаем в этом курсе.
От электронных таблиц к базам данных
Когда мы говорим о хранении данных в виде таблиц, первой ассоциацией часто становится Microsoft Excel или Google Таблицы. Для личного использования или небольшого бизнеса это отличные инструменты. Однако, когда речь заходит о разработке программного обеспечения, обычные файлы перестают справляться.
Представьте, что вы создаете интернет-магазин. В первый месяц у вас 100 клиентов и 50 товаров. Вы можете вести учет в Excel. Но через год у вас 100 000 клиентов, каждый из которых делает по несколько заказов в месяц.
Обычные электронные таблицы имеют физические ограничения (например, в Excel максимум 1 048 576 строк). Кроме того, если два менеджера одновременно попытаются изменить один и тот же файл, возникнет конфликт версий. А если приложение должно искать конкретный заказ среди миллионов записей, чтение файла от начала до конца займет недопустимо много времени.
Здесь на сцену выходят базы данных (БД) — структурированные массивы информации, организованные таким образом, чтобы компьютер мог максимально быстро находить и обрабатывать нужные фрагменты.
Сама по себе база данных — это просто набор файлов на жестком диске сервера. Чтобы с ними работать, нужна система управления базами данных (СУБД). Это сложная программа, которая берет на себя всю черновую работу: она записывает данные на диск, распределяет оперативную память, управляет одновременным доступом тысяч пользователей и защищает информацию от сбоев.
В рамках нашего курса мы будем работать с двумя мощнейшими промышленными СУБД: PostgreSQL (открытая и бесплатная система, стандарт де-факто в современной веб-разработке) и SQL Server (коммерческая система от Microsoft, широко используемая в корпоративном секторе).
Анатомия реляционной модели
Существуют разные подходы к хранению данных, но самым популярным и надежным остается реляционный подход. Термин реляционная база данных происходит от английского слова relation (отношение). В математике и теории баз данных под «отношением» понимается то, что мы в быту привыкли называть таблицей.
В реляционной БД вся информация строго структурирована и хранится в двумерных таблицах. Каждая таблица описывает только одну сущность реального мира.
Структура таблицы состоит из двух главных элементов:
- Столбцы (атрибуты) — задают структуру данных. Например, в таблице клиентов могут быть столбцы «Имя», «Email» и «Дата регистрации». Для каждого столбца жестко задается тип данных: нельзя записать текст в столбец, предназначенный для чисел.
- Строки (записи) — содержат сами данные. Одна строка — это один конкретный экземпляр сущности (один клиент, один товар, один заказ).
Проблема дублирования данных
Чтобы понять главную силу реляционных баз, рассмотрим частую ошибку новичков — попытку хранить всё в одной огромной таблице.
Допустим, мы записываем все продажи в одну таблицу. В ней есть столбцы: Номер заказа, Имя клиента, Адрес клиента, Название товара, Цена товара.
Если клиент Иван Иванов с адресом «г. Москва, ул. Пушкина, д. 10» сделает 50 разных заказов за год, его имя и длинный адрес будут скопированы в таблице 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 заказов, таблица заказов будет содержать записей, но при этом ни один байт личной информации не будет продублирован.
Иерархия объектов в базе данных
Чтобы не запутаться в тысячах таблиц, современные СУБД используют строгую иерархию хранения. Представьте себе матрешку:
- Сервер (Экземпляр) — самый большой уровень. Это физический или виртуальный компьютер, на котором запущена программа СУБД (например, процесс PostgreSQL).
- База данных — изолированное хранилище внутри сервера. На одном сервере может быть база
ecommerce_appдля магазина и базаhr_systemдля отдела кадров. Они полностью независимы. - Схема (Schema) — логическая папка внутри базы данных. В базе магазина может быть схема
inventoryдля таблиц склада и схемаsalesдля таблиц продаж. По умолчанию в PostgreSQL все таблицы создаются в стандартной схемеpublic. - Таблица — конкретный набор строк и столбцов внутри схемы.
Понимание этой структуры критически важно, так как при написании запросов вам часто придется указывать точный путь к данным.
Язык SQL: как разговаривать с базой
СУБД не понимает человеческий язык. Чтобы попросить ее создать таблицу, добавить данные или найти нужного клиента, используется SQL (Structured Query Language — язык структурированных запросов).
SQL — это стандартный язык для всех реляционных баз данных. Выучив его основы, вы сможете работать и с PostgreSQL, и с SQL Server, и с MySQL.
Все операции в базах данных сводятся к четырем базовым действиям, которые программисты называют аббревиатурой CRUD:
- Create (Создание) — добавление новых строк (оператор
INSERT). - Read (Чтение) — поиск и извлечение данных (оператор
SELECT). - Update (Обновление) — изменение существующих данных (оператор
UPDATE). - Delete (Удаление) — стирание данных (оператор
DELETE).
Например, чтобы найти всех клиентов из Москвы, мы напишем запрос, который читается почти как обычное английское предложение:
SELECT Имя, Адрес
FROM Клиенты
WHERE Адрес = 'Москва';
DBeaver: ваш пульт управления
Исторически администраторы работали с базами данных через черное окно терминала, вводя команды текстом. Это мощный, но не самый наглядный способ.
В нашем курсе мы будем использовать DBeaver — универсальный графический интерфейс (GUI) для работы с базами данных.
DBeaver подключается к вашему серверу PostgreSQL или SQL Server и отображает всю сложную иерархию (базы, схемы, таблицы) в виде удобного дерева папок слева на экране.
С помощью DBeaver вы сможете:
- Просматривать содержимое таблиц в виде сетки, похожей на Excel.
- Писать SQL-запросы в удобном редакторе с подсветкой синтаксиса и автодополнением (программа сама подскажет названия таблиц).
- Автоматически строить визуальные схемы связей между таблицами (ER-диаграммы).
- Импортировать данные из обычных CSV-файлов прямо в таблицы базы данных.
Использование графического интерфейса не отменяет необходимости знать SQL. DBeaver — это лишь удобный инструмент, который ускоряет рутинные задачи, но логику извлечения и анализа данных вам предстоит описывать самостоятельно с помощью кода.