Normalize là lưu dữ liệu dạng bảng phẳng giống database: mỗi loại entity một map byId, kèm mảng allIds giữ thứ tự — thay vì giữ nguyên cây JSON lồng nhau mà API trả về.
// nested (khó cập nhật)
{ posts: [{ id: 1, author: { id: 7, name: 'An' }, comments: [...] }] }
// normalized
{
posts: { ids: [1], entities: { 1: { id: 1, author: 7, comments: [11, 12] } } },
users: { ids: [7], entities: { 7: { id: 7, name: 'An' } } },
comments:{ ids: [11, 12], entities: { /* ... */ } },
}Vấn đề của nested:
- Một user xuất hiện ở nhiều post → dữ liệu trùng lặp, sửa tên phải quét mọi chỗ, dễ lệch.
- Cập nhật một comment sâu 3 tầng phải spread lồng nhau nhiều lớp, dễ sai và làm mọi tầng cha đổi reference → re-render diện rộng.
- Tra cứu theo id là O(n) với mảng, O(1) với map.
Trong RTK, createEntityAdapter sinh sẵn state shape { ids, entities } cùng các reducer addOne/upsertMany/removeOne và selector selectAll/selectById, khỏi tự viết. Nếu đã dùng RTK Query hoặc React Query thì việc này ít cần hơn — cache của chúng đã tách theo query key.