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 или нет.