> SmartGate 41 752 9863

Реляционные базы данных

Где хранятся данные, что делает СУБД и зачем нужен SQL

Теория

1. База данных
Практически любое приложение (сайт), с которым вы ежедневно взаимодействуете, будь то портал информационных услуг, онлайн-магазин, социальная сеть, должно где-то хранить данные. Практически любой современный бизнес ежедневно собирает и обрабатывает большой объём данных, которые также должны где-то храниться и как-то использоваться.

Клиенты, товары, заказы, сотрудники, оплаты, даты, статусы — вся эта информация нужна бизнесу каждый день. Пока данных мало, их можно хранить в простых удобных для вас таблицах, например в Excel.

Но каждый день данных становится всё больше и больше. А кроме хранения, ими нужно ещё управлять, преобразовывать и затем использовать в целях компании.

База данных нужна именно для того, чтобы избежать неорганизованного хранения информации. Это структурированное место хранения данных. Не просто набор файлов, а система, в которой информация находится в чёткой, понятной структуре, что позволяет работать с ней предсказуемо и согласованно.

Базы данных бывают разных типов. Типы баз данных, как правило, определяют подход к организации и структуре хранения внутри них. Наиболее популярным типом баз данных (далее БД) является реляционная. Реляционная — это такой тип БД, в которой данные хранятся в таблицах, которые к тому же имеют связи друг с другом. Другие типы БД мы рассматривать не будем.

Зачем бизнесу база данных

Клиенты Кто зарегистрировался, кто что покупал, из какого города пользователь.
Товары Что продаётся, сколько стоит, к какой категории относится.
Заказы Когда оформлен заказ, в каком он статусе, кем обработан.
Аналитика Что продаётся лучше, где просадка, где рост и где ошибка.

2. Таблицы и их структура
В реляционных БД данные хранятся в таблицах. Таблица состоит из строк (которые часто называют записями) и столбцов (можно называть это атрибутами). Строки показывают, про какой конкретный объект хранится информация в таблице, столбцы определяют свойства этого объекта.

Допустим, есть таблица пользователей. В ней могут быть столбцы user_id, first_name, email, city. Это свойства пользователя. А каждая строка — один конкретный пользователь (объект) со своими значениями (свойствами) в этих столбцах.

Как читать таблицу

user_id first_name email city
1 Анна anna@example.com Москва
2 Илья ilya@example.com Казань
3 Мария maria@example.com Сочи
4 Олег oleg@example.com Тула
Столбец. Голубым выделен first_name. Столбец хранит один тип свойства для всех строк сразу.
Строка. Фиолетовым выделена вторая строка. Строка — это одна конкретная запись, здесь один пользователь.
Ячейка. Зелёным выделено значение 'Илья' (характеристика этого клиента). Это пересечение строки и столбца.

Сила реляционной модели хранения в порядке. Одна таблица хранит данные об одном понятном объекте. Пользователи отдельно. Товары отдельно. Заказы отдельно. Состав заказов отдельно. Если бы всю это информацию пытались держать в одной гигантской таблице, одни и те же данные повторялись бы снова и снова, а любое изменение данных превращалось бы в прогулку по минному полю.

3. СУБД
Понятие БД и СУБД часто путают. Это смежные понятия, но не одно и то же. СУБД расшифровывается как система управления базами данных. Еще раз, это не то же самое, что сама база данных.

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

Можно представить архив. Сами папки с документами — это база данных. А сотрудник архива, который знает, где что лежит, кому что можно выдавать и как не устроить бардак, — это СУБД.

Физически данные лежат на жестком диске сервера в виде файлов и внутренних служебных структур. Пользователь обычно этого не видит, и это хорошо. Никому не хочется вручную рыться в системных файлах в поисках заказа номер 57. СУБД берёт эту работу на себя и даёт человеку удобный способ общения с данными.

Приведём ещё одну аналогию. Наш настольный компьютер — это железо, внутри которого есть жёсткий диск. На этом диске мы можем хранить нужную информацию. То есть в этом контексте он — это БД. Но сможем ли мы управлять компьютером, если в нём не окажется операционной системы, например Windows? Нет. Операционная система — это система управления компьютером. СУБД — это система управления базой данных.

БД и СУБД — разные роли

База данных Сами данные и структура, в которой они организованы.
СУБД Программа, которая этими данными управляет и выполняет SQL-запросы.

4. SQL
Из сказанного выше можно сделать вывод: данные компаний хранятся в базах данных. Внутри реляционная БД состоит из таблиц, и, как правило, в каждой таблице хранится информация об одной сущности. Это может быть таблица клиентов, заказов, товаров, сотрудников и так далее. Чтобы всем этим управлять (создавать, изменять, использовать), нужна СУБД. Дальше напрашивается очевидный вопрос: а как управлять самой СУБД? Что нужно ей сообщить, чтобы она сделала то, что нам нужно? Для этого необходимо знание специального языка для общения с БД, который называется SQL.

SQL — это структурированный язык запросов, на котором мы общаемся с СУБД. Не с файлами базы напрямую и не с диском, а с системой управления базами данных.

Через SQL мы говорим: покажи данные, отфильтруй, отсортируй, посчитай, обнови, удали, добавь. То есть SQL — это язык команд. Не место хранения и не программа, а язык.

Ниже первый пример SQL запроса. Вы можете его запустить и посмотреть, как он вытягивает данные из таблицы:

Смысл этого запроса такой: сходи в таблицу users, возьми оттуда несколько столбцов и покажи результат. Даже на этом уровне видно, что SQL — это способ задавать базе точные вопросы.

5. Как приложение добирается до базы данных
Если ваша работа связана с IT-системами, то вам часто будет необходимо писать SQL-запросы своими руками. Этому мы и будем обучаться. Выше мы уже читали, что почти любой сайт взаимодействует с базой данных. Это действительно так: на экране монитора мы видим информацию из БД, например, когда выбираем себе товар к покупке на маркетплейсе. Далее мы оплачиваем его и через несколько дней получаем. Это говорит о том, что наши действия, совершённые на сайте, вносят изменения в БД. Но как это возможно, ведь для этого нужно составить правильный SQL-запрос в СУБД. Разве обычный пользователь сайта должен знать SQL, чтобы заказать себе товар? Ответ: нет. За него этот запрос автоматически собирается бизнес-логикой, на которой написано приложение, то есть кодом.

Соберём всю картину в одну цепочку. Допустим, человек открыл сайт и решил зарегистрироваться. Он заполняет форму на экране, нажимает кнопку, и на этом работа только начинается. Сам экран ничего в таблицы не записывает. Он лишь передаёт команду дальше.

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

На этом шаге бэкенд переводит бизнес-команду в SQL. Он не идёт в таблицы БД сам. Он собирает SQL-команду, например команду на добавление нового пользователя, и отправляет её в PostgreSQL. PostgreSQL как СУБД принимает этот запрос, выполняет его над таблицами в БД и возвращает результат обратно в бэкенд. Бэкенд на основе этого результата формирует HTTP-ответ, а интерфейс показывает человеку итог: регистрация прошла успешно, данные сохранены, можно входить в систему.

Если коротко, путь такой: человек действует в интерфейсе, интерфейс отправляет запрос в бэкенд, бэкенд переводит бизнес-команду в SQL, СУБД выполняет SQL над таблицами, а потом вся цепочка идёт назад уже с готовым результатом.

Путь от клика до записи в таблицу

Пользователь Заполняет анкету на сайте и нажимает кнопку регистрации.
Интерфейс сайта Браузер собирает действие пользователя и готовит отправку данных.
HTTP-запрос Браузер упаковывает данные анкеты, например имя, email и пароль, и отправляет их на сервер в виде HTTP-запроса.
Бэкенд Код приложения принимает запрос, проверяет поля, может хэшировать пароль, убеждается, что пользователь с таким email ещё не существует, и решает, что нужно создать новую запись.
SQL-запрос Внутри бэкенда бизнес-команда переводится в язык базы. Грубо говоря, мысль «зарегистрировать пользователя» превращается в SQL-команду на вставку строки в таблицу.
PostgreSQL СУБД выполняет SQL-команду и в этом случае вставляет новую строку в таблицу пользователей.
Таблицы базы Например, новая запись попадает в таблицу пользователей.
Ответ назад Результат возвращается в бэкенд, потом в браузер, а затем на экран.

6. Знакомство со структурой нашей учебной БД
Наша учебная схема сделана похожей на небольшой онлайн магазин. В ней есть пользователи, товары, заказы, состав заказов, сотрудники и отделы.

Основные таблицы, с которыми мы будем работать дальше:

users — пользователи;
products — товары;
orders — заказы;
order_items — строки состава заказа;
workers — сотрудники;
departments — отделы.

Учебная схема на одном экране

Крутите колесо мыши, чтобы приближать или отдалять схему. Зажмите левую кнопку мыши и потяните фон, чтобы сдвинуть всю схему. Таблицы можно перетаскивать отдельно.
users
PKuser_id
colfirst_name
collast_name
colemail
colcity
colregistration_date
orders
PKorder_id
FKuser_id
FKworker_id
colorder_date
colstatus
order_items
PKorder_item_id
FKorder_id
FKproduct_id
colquantity
products
PKproduct_id
colproduct_name
colcategory
colprice
workers
PKworker_id
colfirst_name
collast_name
FKdepartment_id
colposition
colsalary
colhire_date
departments
PKdepartment_id
coldepartment_name

Почему таблицы связывают между собой

Отдельные таблицы сами по себе не дают целостной картины. Пользователь живёт в одной таблице, заказ — в другой, товары — в третьей, сотрудники — в четвёртой. Пока между ними нет связей, база хранит куски несвязанной между собой информации, а не одну логичную историю.

Связи решают эту задачу. Они показывают, какая запись к чему относится. Благодаря этому база понимает, кто сделал заказ, какие товары в него вошли, какой сотрудник его обработал и в каком отделе этот сотрудник работает. Поэтому линии на диаграмме здесь не декоративные. Они показывают реальную логику данных.

Чтобы эта логика работала, используются два типа столбцов:

первичный ключ — столбец идентификатор, который однозначно отличает одну строку от другой за счет того, что его значения всегда уникальны. Например, user_id или order_id;
внешний ключ — столбец, который хранит ссылку на нужную строку из другой таблицы. Например, user_id в заказах показывает, какому пользователю принадлежит этот заказ.

Первичный ключ отвечает на вопрос: «что это за запись?». Внешний ключ отвечает на вопрос: «с чем она связана?». Вместе они собирают отдельные таблицы в единую систему, по которой потом можно идти шаг за шагом: от пользователя к заказу, от заказа к товарам, от сотрудника к отделу.

Когда такие связи настроены, база становится единой логической моделью.

Посмотрим еще на один SQL запрос, который обращается к таблице заказов:

Результат этого запроса отражает данные из таблицы заказов, то есть один из реальных бизнес-процессов компании. У каждого заказа есть номер (идентификатор), дата создания, статус и пользователь, к которому он относится. Из таких записей собираются отчёты, история покупок, воронки, метрики и вся остальная аналитика.

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

Практика

Проверь себя

Ответьте на вопросы, чтобы закрепить материал:

1
Что в этой теме называется СУБД?
2
В чём главное различие между базой данных и СУБД?
3
Какую роль играет SQL в общей цепочке работы сайта?
4
Что сначала происходит после того, как пользователь заполнил анкету и нажал кнопку регистрации?
5
Что обычно означает строка таблицы?
6
Зачем таблицы в реляционной базе связывают между собой?
7
Что делает первичный ключ?
8
Что делает внешний ключ?