Данные, которые не теряются
Порядок в данных
Вид
Текст20

Начальный · Глава 1 / 18

Модель: одна строка — один смысл

После главы: Отделить книгу, издание и экземпляр перед созданием таблицы.

В этой главе

Сущность начинается с вопроса

В списке библиотеки повторяется название «Тихая мастерская». Это ошибка или два экземпляра? Ответ зависит от смысла строки. Название произведения, конкретное издание и физическая книга на полке — разные сущности. Сначала сформулируйте, что именно идентифицирует запись и какие изменения не превращают её в другую запись.

В учебной электронной библиотеке выберем книгу и её редакции. У книги стабильный book_id и название; у редакции собственный edition_id, номер и ссылка на книгу. Исправление опечатки в названии не должно разрушать историю редакций. Поэтому название неудобно использовать как единственный идентификатор: оно может измениться или совпасть.

Повторение, которое дорого исправлять

Если название книги хранится в каждой редакции как текущий справочный факт, переименование требует согласованно исправить несколько строк. Отдельная таблица книг позволяет менять его в одном месте. Но историческое название в документе заказа может быть намеренным снимком: оно отвечает на вопрос «что было обещано тогда», а не «как называется сейчас».

Не превращайте нормализацию в запрет любого дублирования. Для каждого повторяемого значения назовите источник истины и правило обновления. Независимые факты хранят независимо; вычисляемое значение либо считают по исходным данным, либо явно поддерживают как производное. Чем раньше записан этот договор, тем меньше неожиданных расхождений в отчётах.

Функциональная зависимость объясняет разделение

В нашей модели book_id определяет текущее название, а edition_id — книгу и номер редакции. Если хранить оба факта в одной таблице редакций, появляются аномалии: книгу без редакций некуда добавить, а последнее удаление редакции может стереть её название. Разделение выбирают по зависимостям данных, а не по правилу «таблиц должно быть много».

Попробуйте неверную альтернативу: использовать название как ключ. Переименование становится изменением идентичности, а одноимённые книги невозможно различить. Исторический снимок названия в заказе при этом допустим: у него иной смысл и собственный момент фиксации.

Проверить модель на неудобном случае

Модель стоит проверять на действиях, а не только на диаграмме. Добавьте книгу без редакций, две одноимённые книги, новую редакцию существующей книги и заказ на прежнюю редакцию. Затем переименуйте книгу. Если какая-то допустимая операция требует временно записать ложное значение, схема ещё не выражает предметный договор. Если переименование меняет исторический заказ без явного решения, смешаны текущий факт и снимок прошлого.

Кардинальность связи тоже задаётся смыслом. У книги может быть много редакций, каждая редакция относится к одной книге. У заказа может быть несколько строк, каждая ссылается на конкретную редакцию. Уникальность пары book_id и revision запрещает две первые редакции одной книги, но разрешает первые редакции разных книг. Один только внешний ключ не обеспечивает это правило: он проверяет существование книги, а не уникальность номера внутри неё.

Выбор искусственного идентификатора не отменяет предметной уникальности. Случайный edition_id позволяет создать две записи с одинаковыми book_id и revision, если нет дополнительного ограничения. И наоборот, составной естественный ключ может осложнить ссылки при изменении договорённого номера. Поэтому техническую идентичность и предметные ограничения рассматривают отдельно; обе могут быть нужны в одной таблице.

Для каждой сущности полезно записать, кто и когда имеет право её менять. Черновик редакции может редактироваться, опубликованный артефакт — оставаться неизменным. Строка заказа может фиксировать цену, даже когда справочник меняется. Такое описание жизненного цикла помогает выбрать ограничения и API позже. Диаграмма связей без правил изменения показывает только часть модели и часто скрывает самые дорогие ошибки.

Разобранный пример

Карточка и две редакции

Это модель отношений, а не данные реальных покупателей. Редакции 1 и 2 относятся к одной книге. Название присутствует только в справочнике. Удаление или изменение связи должно подчиняться отдельному правилу, которое поддерживает внешний ключ.

text
books
book_id | title
b-1     | Тихая мастерская

editions
edition_id | book_id | revision
e-1        | b-1     | 1
e-2        | b-1     | 2

Теперь самостоятельно

Практика

Добавьте вторую книгу с таким же названием и первой редакцией. Затем предложите, где хранить выбранную редакцию в учебном заказе.

Результат: Три новые строки либо ссылки и пояснение идентичности.

Подсказка
  • Название может совпасть; идентификаторы должны различаться.
Решение и проверка

Создайте books(b-2, «Тихая мастерская») и editions(e-3, b-2, 1). Две одинаковые надписи не означают один объект. В строке заказа сохраните ссылку на e-3, если покупателю обещана конкретная редакция.

Если продукт включает будущие обновления, это уже другое правило выдачи доступа. Его следует выразить отдельно, а не молча заменить edition_id ссылкой на последнюю редакцию.

Проверьте себя без текста

Что определяет смысл строки?

Объект или факт, который она представляет, и правило его идентичности.

Почему снимок названия в заказе не всегда ошибка?

Он может фиксировать историческое обещание, независимое от текущего справочника.

Проверить по первоисточникам

Конец образца

Полный том содержит 18 глав, решения, итоговый проект и словарь. Продажи откроются после предметной редактуры и подключения магазина.