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.
- Обновите одну запись — представления через селекторы.
- Продумайте каскад при удалении.
- Нормализуйте при боли от дублирования, не по умолчанию.