intermediate

Нормализация

Храните граф сущностей по ID, чтобы избежать дублирования вложенных объектов, дорогих обновлений и расхождений в представлениях.

Нормализация хранит сущности по ID в плоских map вместо вложенных дубликатов. Когда один пользователь в десяти списках, одна запись в `users.byId` обновляет все представления.

					// Нормализованная форма
const state = {
  users: { u1: { id: 'u1', name: 'Ada' } },
  posts: {
    p1: { id: 'p1', authorId: 'u1', title: 'Hello' },
  },
  postsByUser: { u1: ['p1'] },
};
				

| Вложенное дерево | Нормализованные map | |------------------|---------------------| | Простое чтение на одном экране | Много экранов делят сущности | | Риск устаревших копий | Одна точка обновления | | Быстрый прототип | Селекторы склеивают ID в объекты |

`createEntityAdapter` в Redux Toolkit автоматизирует CRUD на нормализованных slice. Связи собирайте в селекторах, а не дублируйте вложенные объекты при каждом fetch.

Компромисс: плоские обновления и общие сущности против дополнительной логики селекторов и join при чтении.

На интервью: когда нормализация окупается и что должны делать селекторы после записи.

Типовые ошибки: ранняя нормализация, осиротевшие ID после удаления, копирование денормализованного ответа API в global state как есть.

Чеклист:

  • Сущности по ID; связи — списками ID.
  • Обновите одну запись — представления через селекторы.
  • Продумайте каскад при удалении.
  • Нормализуйте при боли от дублирования, не по умолчанию.