Всё, что происходит в приложении, где-то хранится: заказы магазина, профили пользователей, остатки на складе. Хранится это не в файлах и не «в программе» — почти всегда за приложением стоит база данных. Тот, кто умеет в неё заглянуть, видит продукт насквозь: не «на экране написано „Оплачен"», а «в таблице заказов статус действительно paid». Этот цикл научит вас заглядывать. Начнём с устройства.

Почему не Excel и не файлы

Казалось бы, таблица — она и в Excel таблица. Но у файла три фатальные проблемы, когда с данными работают тысячи людей одновременно:

  • Одновременный доступ. Два человека купили последний товар в одну секунду — кто успел? Файл на такой вопрос отвечает «как повезёт», база — строго по правилам.
  • Надёжность. Если программа упала посреди записи, файл остаётся полузаписанным. База гарантирует: операция либо выполнилась целиком, либо не выполнилась вовсе.
  • Скорость поиска. Найти один заказ среди десяти миллионов в файле — значит прочитать весь файл. База находит его за миллисекунды.

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

Таблица: строки и столбцы

Данные в базе лежат в таблицах. Таблица похожа на лист Excel со строгими правилами:

  • Столбцы заданы заранее, у каждого есть имя и тип: id — число, email — строка, created_at — дата и время. Записать текст в числовой столбец нельзя — база не даст.
  • Строки — сами данные: одна строка = один клиент, один заказ, один товар.

Наш сквозной пример на весь цикл — база интернет-магазина:

customers (клиенты)          orders (заказы)
id | name    | email          id  | customer_id | status  | amount
1  | Анна    | anna@...       101 | 1           | paid    | 2500
2  | Борис   | boris@...      102 | 1           | created | 900
3  | Вера    | vera@...       103 | 2           | paid    | 1200

Первичный ключ и связи

В каждой таблице есть столбец (обычно id), значение которого уникально для каждой строки, — это первичный ключ. Он нужен, чтобы указывать на строку однозначно: имена и почты могут совпадать или меняться, id — никогда.

Теперь главное. Обратите внимание на customer_id в таблице заказов: это ссылка на id клиента. Заказ 101 принадлежит Анне — не потому, что в нём написано «Анна», а потому, что в нём записана единица. Такой столбец-ссылку называют внешним ключом. Данные в базе намеренно не дублируются: имя клиента хранится один раз в customers, а все его заказы просто ссылаются на него. Поменялась почта — правится одна строка, а не тысяча заказов. Из-за этих связей базы и называют реляционными (relation — отношение), и именно поэтому дальше в цикле нам понадобится JOIN — операция сборки данных из связанных таблиц.

Где живёт база и как в неё попасть

База — это программа-сервер: она работает на отдельной машине, а приложение подключается к ней по сети. Тестировщику или разработчику для доступа нужны четыре вещи: адрес сервера, имя базы, логин и пароль — их выдают на проекте (и на тестовом стенде они свои, не боевые!).

Подключаются через клиент — программу с окном для запросов: универсальный DBeaver, pgAdmin для PostgreSQL, консольный psql. Какой бы клиент вы ни выбрали, суть одна: пишете SQL-запрос, нажимаете «выполнить», видите результат таблицей.

Где это применяется

Понимание «таблицы + связи» — это карта местности. Открыв незнакомую базу проекта, вы будете искать знакомые ориентиры: таблицу пользователей, таблицу главных сущностей продукта, столбцы-ссылки между ними. Схема из пары десятков таблиц перестаёт пугать, когда видишь в ней не набор имён, а связи: «заказы ссылаются на клиентов, позиции заказа — на заказы и товары».

Где спотыкаются начинающие:

  • Думают, что база — это и есть приложение. Нет: приложение — код, база — хранилище. Одно и то же приложение может смотреть на тестовую и боевую базу — и вести себя «по-разному» только из-за данных.
  • Ищут в базе то, что видят на экране. На экране «Оплачен», в базе — paid: интерфейс переводит и приукрашивает. Смотреть надо на сырые значения.
  • Боятся сломать базу запросом на чтение. Чтение (SELECT) данных не меняет — читайте смело. Осторожность нужна с изменением, о нём — отдельная статья цикла.

Что учить дальше. Пора писать первый запрос — SELECT: выбрать, отфильтровать, отсортировать.