Начальный · Глава 1 / 18
Модель: одна строка — один смысл
После главы: Отделить книгу, издание и экземпляр перед созданием таблицы.
В этой главе
Сущность начинается с вопроса
В списке библиотеки повторяется название «Тихая мастерская». Это ошибка или два экземпляра? Ответ зависит от смысла строки. Название произведения, конкретное издание и физическая книга на полке — разные сущности. Сначала сформулируйте, что именно идентифицирует запись и какие изменения не превращают её в другую запись.
В учебной электронной библиотеке выберем книгу и её редакции. У книги стабильный book_id и название; у редакции собственный edition_id, номер и ссылка на книгу. Исправление опечатки в названии не должно разрушать историю редакций. Поэтому название неудобно использовать как единственный идентификатор: оно может измениться или совпасть.
Повторение, которое дорого исправлять
Если название книги хранится в каждой редакции как текущий справочный факт, переименование требует согласованно исправить несколько строк. Отдельная таблица книг позволяет менять его в одном месте. Но историческое название в документе заказа может быть намеренным снимком: оно отвечает на вопрос «что было обещано тогда», а не «как называется сейчас».
Не превращайте нормализацию в запрет любого дублирования. Для каждого повторяемого значения назовите источник истины и правило обновления. Независимые факты хранят независимо; вычисляемое значение либо считают по исходным данным, либо явно поддерживают как производное. Чем раньше записан этот договор, тем меньше неожиданных расхождений в отчётах.
Функциональная зависимость объясняет разделение
В нашей модели book_id определяет текущее название, а edition_id — книгу и номер редакции. Если хранить оба факта в одной таблице редакций, появляются аномалии: книгу без редакций некуда добавить, а последнее удаление редакции может стереть её название. Разделение выбирают по зависимостям данных, а не по правилу «таблиц должно быть много».
Попробуйте неверную альтернативу: использовать название как ключ. Переименование становится изменением идентичности, а одноимённые книги невозможно различить. Исторический снимок названия в заказе при этом допустим: у него иной смысл и собственный момент фиксации.
Проверить модель на неудобном случае
Модель стоит проверять на действиях, а не только на диаграмме. Добавьте книгу без редакций, две одноимённые книги, новую редакцию существующей книги и заказ на прежнюю редакцию. Затем переименуйте книгу. Если какая-то допустимая операция требует временно записать ложное значение, схема ещё не выражает предметный договор. Если переименование меняет исторический заказ без явного решения, смешаны текущий факт и снимок прошлого.
Кардинальность связи тоже задаётся смыслом. У книги может быть много редакций, каждая редакция относится к одной книге. У заказа может быть несколько строк, каждая ссылается на конкретную редакцию. Уникальность пары book_id и revision запрещает две первые редакции одной книги, но разрешает первые редакции разных книг. Один только внешний ключ не обеспечивает это правило: он проверяет существование книги, а не уникальность номера внутри неё.
Выбор искусственного идентификатора не отменяет предметной уникальности. Случайный edition_id позволяет создать две записи с одинаковыми book_id и revision, если нет дополнительного ограничения. И наоборот, составной естественный ключ может осложнить ссылки при изменении договорённого номера. Поэтому техническую идентичность и предметные ограничения рассматривают отдельно; обе могут быть нужны в одной таблице.
Для каждой сущности полезно записать, кто и когда имеет право её менять. Черновик редакции может редактироваться, опубликованный артефакт — оставаться неизменным. Строка заказа может фиксировать цену, даже когда справочник меняется. Такое описание жизненного цикла помогает выбрать ограничения и API позже. Диаграмма связей без правил изменения показывает только часть модели и часто скрывает самые дорогие ошибки.
Разобранный пример
Карточка и две редакции
Это модель отношений, а не данные реальных покупателей. Редакции 1 и 2 относятся к одной книге. Название присутствует только в справочнике. Удаление или изменение связи должно подчиняться отдельному правилу, которое поддерживает внешний ключ.
textbooks
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 глав, решения, итоговый проект и словарь. Продажи откроются после предметной редактуры и подключения магазина.