Код-ревью Middle ER-модели и нормализация обновлено

Ревью DDL заказов

Вопрос

Аналитик набросал физическую модель для заказов. Найди проблемы.

CREATE TABLE orders (
  id serial,
  client_name text,
  client_phone text,
  items text,
  total float,
  status text,
  created_at timestamp
);

Коротко

Хорошая модель: orders(id PK, clientid FK, status с ограничением, total numeric, createdat timestamptz NOT NULL) и orderitems(orderid, productid, qty, price) с составным ключом. Телефон клиента в заказе оправдан только как снимок контакта доставки, и тогда это осознанное решение, а не копия.

Что должен найти ревьюер

  1. Ошибкастрока 2
    Нет первичного ключа: id без PRIMARY KEY
  2. Стильстрока 3
    Данные клиента копируются в каждый заказ вместо FK на clients: аномалии обновления
  3. Ошибкастрока 5
    Товары списком в одной колонке нарушают 1НФ: нужна таблица order_items
  4. Ошибкастрока 6
    Деньги во float дают ошибки округления: numeric(12,2) или целые копейки
  5. Ошибкастрока 7
    Статус свободным текстом без справочника или CHECK: появятся «Paid», «оплачен», «paid »
  6. Стильстрока 8
    timestamp без часового пояса и без NOT NULL: для распределённой системы лучше timestamptz

Разбор

Хорошая модель: orders(id PK, client_id FK, status с ограничением, total numeric, created_at timestamptz NOT NULL) и order_items(order_id, product_id, qty, price) с составным ключом. Телефон клиента в заказе оправдан только как снимок контакта доставки, и тогда это осознанное решение, а не копия.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.