foundation
Tables
Представляйте entities и relationships через rows, columns, constraints, nullability и types, соответствующие domain.
Таблица — базовая реляционная единица для сущности или связи: строки — экземпляры, столбцы — атрибуты с фиксированным типом. Хорошая схема отображает доменные сущности на таблицы и задаёт правила на уровне БД.
| Элемент | Роль | |---------|------| | Тип столбца | `INTEGER`, `TEXT`, `TIMESTAMP`, `JSONB` — семантика хранения и сравнения | | `NOT NULL` | Запрещает отсутствие обязательного факта | | `DEFAULT` | Безопасное значение при вставке, если приложение не передало столбец | | `CHECK` | Доменное правило, которое БД отклонит до commit | | `UNIQUE` | Альтернативные естественные ключи (email, slug) |
CREATE TABLE orders (
id BIGINT PRIMARY KEY,
customer_id BIGINT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending', 'paid', 'shipped')),
total_cents INTEGER NOT NULL CHECK (total_cents >= 0),
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
Nullable-столбцы кодируют необязательные факты; злоупотребление `NULL` усложняет предикаты и join. Выбирайте типы с учётом диапазона, точности и часовых поясов — не храните деньги в `FLOAT`.
На интервью: пройдите от продуктовой концепции (заказ, пользователь, подписка) к границам таблиц, обязательным столбцам и тому, какие инварианты — в constraints, а какие — в коде приложения.
Типовые ошибки: одна широкая таблица на несвязанные концепции; nullable там, где факт логически обязателен; неверные типы (`FLOAT` для денег, `TEXT` для enum без checks); отсутствие `created_at` / audit-столбцов, когда продукту нужна история.
Компромисс — между нормализацией и строгостью constraints с одной стороны и трением миграций и гибкостью приложения с другой: переносите инварианты в схему, когда исправление «грязных» данных потом дорого.
Чеклист:
- Назовите сущность, которую представляет каждая таблица.
- Обозначьте обязательные факты через `NOT NULL` и разумные defaults.
- Выберите типы с учётом точности, timezone и диапазона.
- Добавьте `CHECK` или `UNIQUE`, где у домена жёсткие правила.
- Объясните, почему столбец nullable или нет.