теория

Дерево против таблиц

Помнишь, ты только что смотрел на сорок nullable-колонок и EAV-костыль — и чувствовал, что тут что-то не так? Давай назовём это «что-то» по имени. От имени всегда становится легче.

Разрыв между объектами в коде и таблицами в базе называется . В коде карточка товара — один цельный объект с вложенными атрибутами. А реляционная модель требует разложить его по плоским таблицам с одинаковыми строками — это и есть «шредирование». прячет часть перевода, но не сам разрыв — и подкидывает свои ловушки вроде .

Как понять, какая модель подходит? Смотри на форму связей — она и есть подсказка:

  • One-to-many (у товара несколько атрибутов, у резюме несколько мест работы) — это дерево. Дерево уютно живёт в одном JSON-документе: вся карточка целиком, в одном месте.
  • Many-to-one (много товаров — одна категория) и many-to-many (товары — ярмарки выходного дня) — это уже ссылки между деревьями, в один документ их не уместить. Здесь нужны джойны — родная стихия реляционной модели; документные базы их поддерживают слабо или перекладывают на приложение.

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

А вот две операции, которые важно различать:

  • — хранить факт в одном месте и ссылаться на него по id. (У id нет человеческого смысла — поэтому ему и не нужно никогда меняться.)
  • — скопировать факт туда, где его читают.
ЗаписьЧтениеРиск
Нормализованодёшево: одна копияджойн на каждое чтение
Денормализованодорого: обновить все копиидёшево: всё на местекопии разъезжаются

И напоследок разрушим страшилку «джойны не масштабируются». X (бывший Twitter) в материализованном таймлайне хранит только id постов, а на каждый просмотр ленты дотягивает по ним тексты, лайки и профили. Это джойн на каждое чтение — в одном из крупнейших сервисов планеты. Денормализуют не всё подряд, а лишь то, что редко меняется и дорого собирать; то, что меняется часто (рейтинг, имя, цена), оставляют нормализованным.

← назад