теория
Помнишь, ты только что смотрел на сорок nullable-колонок и EAV-костыль — и чувствовал, что тут что-то не так? Давай назовём это «что-то» по имени. От имени всегда становится легче.
Разрыв между объектами в коде и таблицами в базе называется . В коде карточка товара — один цельный объект с вложенными атрибутами. А реляционная модель требует разложить его по плоским таблицам с одинаковыми строками — это и есть «шредирование». прячет часть перевода, но не сам разрыв — и подкидывает свои ловушки вроде .
Как понять, какая модель подходит? Смотри на форму связей — она и есть подсказка:
За что любят документ — за локальность: карточка лежит непрерывным куском, одно чтение вместо джойна по пяти таблицам. Плата честная: документ обычно читается и переписывается целиком, поэтому его держат небольшим и не дёргают точечными правками по десять раз в секунду.
А вот две операции, которые важно различать:
| Запись | Чтение | Риск | |
|---|---|---|---|
| Нормализовано | дёшево: одна копия | джойн на каждое чтение | — |
| Денормализовано | дорого: обновить все копии | дёшево: всё на месте | копии разъезжаются |
И напоследок разрушим страшилку «джойны не масштабируются». X (бывший Twitter) в материализованном таймлайне хранит только id постов, а на каждый просмотр ленты дотягивает по ним тексты, лайки и профили. Это джойн на каждое чтение — в одном из крупнейших сервисов планеты. Денормализуют не всё подряд, а лишь то, что редко меняется и дорого собирать; то, что меняется часто (рейтинг, имя, цена), оставляют нормализованным.