База данных
Рубрика о том, как устроить базу данных, чтобы она не противоречила сама себе и быстро отвечала на запросы. Проектирование баз данных разбираем на учебной схеме магазина: таблицы создаются запросами CREATE TABLE, заполняются, а вывод каждого запроса приводим дословно. Примеры запускаются в SQLite из Python, сервер ставить не нужно.
Начинаем с нормализации: первая, вторая и третья нормальные формы, форма Бойса-Кодда, аномалии вставки, обновления и удаления и случаи, когда данные дублируют сознательно. Рядом темы, без которых схема плохо живёт в проде: внешние ключи, индексы и план запроса, перенос данных из старой таблицы с проверкой, что ни одна строка не потерялась.
Подзапросом в SQL называют запрос SELECT в круглых скобках внутри другого запроса. Внешний запрос использует его результат как одно значение, как список
Оконные функции SQL выполняют вычисления для каждой строки по набору связанных с ней строк и при этом не схлопывают результат, как GROUP BY: строк на выходе
Первичный ключ (PRIMARY KEY) однозначно идентифицирует каждую строку таблицы: его значения уникальны и не бывают пустыми. Внешний ключ (FOREIGN KEY) лежит
Транзакции SQL объединяют несколько операций в одно целое: база данных фиксирует либо все изменения, либо ни одного. Транзакция пишется тремя командами
SQL JOIN соединяет строки двух таблиц в одну строку результата по условию, обычно по равенству ключей: ON orders.customer_id = customers.





