Паттерны моделирования для документных, ключ-значение, ширококолоночных, графовых и векторных хранилищ — когда встраивать, ссылаться, денормализовать или группировать по временным окнам.
Хранилища NoSQL меняют фиксированные схемы и join-ы на горизонтальное масштабирование. Каждое семейство моделирует связи по-своему, поэтому шаблон доступа — а не нормальная форма — диктует структуру.
Справочная таблица · 28 записи
Моделирование данных NoSQLExplained
28 of 28 rows
Документы
Вложенные поддокументы живут внутри одного родительского документа вместо отдельных таблиц.
Связи один-к-немногим, читаемые вместе. Заказ со своими позициями. Пользователь с тремя адресами.
Храните внешний id, а не данные. Разрешайте его вторым чтением или $lookup.
Крупные, разделяемые или независимо обновляемые сущности. Связи многие-ко-многим между коллекциями.
Родитель встраивает короткий массив детей; весь набор умещается и загружается как один документ.
Пара телефонных номеров или настроек в профиле. Одно чтение возвращает родителя и детей.
Дети живут в собственной коллекции; каждый несёт id родителя, либо родитель держит ограниченный массив id.
Наборы, слишком большие или слишком независимые для встраивания. Запрашивайте детей по id родителя.
Ребёнок хранит id родителя; родитель никогда не перечисляет детей, потому что набор не ограничен.
События, логи или голоса, привязанные к хосту или пользователю. Фильтруйте детей по id родителя и пагинируйте.
Документы разных типов сущностей делят одну коллекцию, различаясь полем типа.
Комментарии или уведомления у многих видов родителей, все запрашиваются одним способом.
Несколько экстремальных сущностей выносятся из общей формы, чтобы их размер или трафик не искажал остальные.
Аккаунты знаменитостей, чьи списки подписчиков или счётчики переросли бы обычный документ.
Каждая ревизия — новый документ с тем же id и растущим номером версии; запрос выбирает последнюю.
Аудиторские следы и история правок, где старые ревизии остаются запрашиваемыми.
Производные значения вычисляются при записи и хранятся рядом с данными, которые суммируют.
Итоги, рейтинги и top-N, которые иначе запускали бы агрегацию при каждом чтении.
Ключ-значение и ширококолоночные
Термин проектирования DynamoDB: сворачивает много типов сущностей в одну таблицу через перегруженные ключи партиции и сортировки.
Выбирайте разнородные элементы одним запросом, без join.
Один атрибут ключа служит многим типам сущностей, помечен префиксами вроде USER# или ORDER#.
Дизайны single-table. Группируйте связанные элементы под одной партицией и забирайте одним запросом.