Базы данных
Реляционная модель: тест с множественным выбором
Шесть вопросов, проходящих сквозь весь юнит. Ни один не про заучивание определения — каждый это решение по дизайну схемы под реальными ограничениями, где неверный выбор оплачивается на миграции, а не на проектировании.
Убедитесь, что вы связываете спину юнита: keys и constraints, нормальные формы vs намеренная денормализация, JSONB vs типизированные колонки vs side-таблицы, экономика foreign key на масштабе, физическое хранение и то, как схема меняется без простоя.
В таблице customers email используется как PRIMARY KEY. Маркетинг теперь хочет, чтобы пользователи могли менять email. В чём корневая проблема и стандартное решение?
Таблица хранит `orders(order_id, customer_id, customer_city)`, где primary key — только `order_id`. Какую нормальную форму она нарушает и что ломается в продакшене?
Маркетплейсу нужны свободные теги товаров, поддерживающие четыре запроса: показать теги товара, перечислить все товары с тегом X, посчитать товары по тегу и переименовать тег глобально. Какая форма хранения дёшево покрывает все четыре на масштабе?
Senior-инженер предлагает отключить foreign keys по всей типичной B2B SaaS-схеме (таблицы до 100M строк), чтобы «улучшить производительность записи». Как читать это предложение?
`SELECT * FROM events ORDER BY created_at DESC LIMIT 100` на таблице в 50M строк с индексом на created_at в 3× медленнее ожидаемого. В таблице JSONB-колонка payload в среднем 8KB. Наиболее вероятная причина и исправление?
Колонку `user_name` нужно превратить в `display_name` на таблице в 50M строк, общей для многих сервисов, без простоя. Какой подход верный и почему однострочный rename неверен?
Сквозная линия юнита — одна дисциплина решений: кладите identity в неизменяемый surrogate key и охраняйте business keys через UNIQUE NOT NULL; нормализуйте до 3NF, чтобы две строки не могли разойтись, и денормализуйте только с явным согласованием; тянитесь к side-таблице в момент, когда запрашиваете с другой стороны; держите FK-constraints, пока измеренное ограничение шардинга или каскада не вынудит иначе; помните, что физическое хранение (TOAST, page layout) делает SELECT * дорогим на широких строках; и меняйте живую схему через expand-then-contract, никогда не ломая на месте. Каждый ответ здесь сводится к «проектируй под запросы и жизненный цикл, а не под первый insert».