Как разложить параметры книги по таблицам базы данных?
Что проверяют
Умеете ли вы превратить предметную область в модель данных: выделить сущности, найти связи «многие ко многим» и выяснить контекст до того, как рисовать таблицы. Следом обычно просят нарисовать ER-диаграмму или добавить в модель выдачу книг читателям.
Как отвечать
Начните с уточнения: это каталог магазина, библиотека или издательство. От ответа зависит, будут ли в модели цены, экземпляры и история. Дальше разложите параметры:
- книга (произведение): название, язык оригинала, год первой публикации, аннотация;
- издание: конкретный выпуск с ISBN, годом, форматом и числом страниц. У одного произведения бывает несколько изданий, и ISBN принадлежит изданию, а не книге;
- автор: имя, даты жизни. Связь с книгой «многие ко многим» через таблицу
book_authorс полямиrole(автор, переводчик, иллюстратор) иposition, чтобы сохранить порядок имён на обложке; - жанр: справочник и связь
book_genre, тоже «многие ко многим»; - издательство: справочник, связь с изданием «один ко многим»;
- экземпляр: для библиотеки или склада, инвентарный номер и состояние, ссылается на издание.
Проговорите нормализацию: каждый факт хранится в одном месте, поэтому имя автора живёт в author, а не повторяется в строке каждой книги. В этом и смысл 3НФ. Ограничения тоже часть модели: UNIQUE на ISBN, NOT NULL на название, внешние ключи с понятным поведением при удалении.
Если речь о магазине, цену выносят в отдельную таблицу с датами действия и валютой: цена меняется, а заказам нужна та, что действовала в момент покупки.
Где спотыкаются
Кладут author_id прямо в таблицу книг. Первая же книга двух соавторов ломает модель, и появляется author_id_2.
Смешивают книгу и издание. Тогда один роман оказывается в каталоге двадцатью независимыми записями, а отзывы и рейтинг разъезжаются по ним.
Нормализуют всё подряд, вплоть до справочника для числа страниц, и не могут объяснить зачем. Аналитика слушают внимательнее, когда он сам называет, где денормализация оправдана, например в витрине для поиска по каталогу.