Tôi đã cố gắng tìm hiểu cách cấu trúc tốt hơn các cửa hàng Redux của mình và vấp phải bài học này của Dan.Redux - Tại sao chuẩn hóa?
https://egghead.io/lessons/javascript-redux-normalizing-the-state-shape#/guidelinesModal
Mặc dù tôi hiểu làm thế nào để đi về bình thường hóa dữ liệu của tôi theo cách này, tôi không hiểu được động lực đằng sau nó. Đặc biệt, tôi có hai câu hỏi.
Tại sao mảng đơn giản không đủ? Dan đề cập - "Trong các ứng dụng phức tạp, chúng tôi có thể có nhiều hơn một mảng đơn và todos có cùng ID trong các mảng khác nhau có thể bị mất đồng bộ". Tôi không hiểu điều này, tôi có thể có một ví dụ? Lợi ích duy nhất tôi thấy từ việc sử dụng một đối tượng được cải thiện hiệu quả vì chúng tôi không cần phải ánh xạ trên toàn bộ mảng, trong trường hợp tôi muốn ủy quyền một số việc cần làm cho một bộ giảm tốc khác.
Tại sao chúng ta cần duy trì danh sách allIds? Tại sao duy trì trạng thái bổ sung này, khi chúng ta có thể dễ dàng ánh xạ qua danh sách tất cả các todos và lấy nó?
Tôi biết rằng normalizr thực hiện điều này cho chúng tôi, nhưng tại sao chúng ta nên bình thường hóa ngay từ đầu? Liệu nó có hợp lý để bình thường hóa ngay cả khi các câu trả lời không được lồng sâu?
Sửa 1:
Cám ơn câu trả lời của bạn, Christopher.
Chúng ta hãy giả sử rằng cây tiểu bang của bạn trông như thế này
{
user: {
byId: {
1: {
id: 1,
name: 'Buy stuff'
},
2: {
id: 2,
name: 'Yeah'
}
}
},
allIds: [1, 2],
subscribedIds: [5],
}
department: {
byId: {
5: {
id: 5,
name: 'Sell Stuff'
}
},
allIds: [5],
subscribedIds: []
}
}
Tôi không thấy lợi ích của việc có một đối tượng ở vị trí của một mảng ở đây. Tôi cũng có thể có bộ chọn mà sẽ lấy todo đăng ký bằng ID từ các phòng ban, ngay cả khi nó là một mảng. Có vẻ như sự hiểu biết của tôi về khái niệm này là một chút thiếu. Bạn có thể vui lòng xây dựng?
Vâng. Về câu hỏi cuối cùng của bạn, nếu hiểu bạn, chỉ cần có một mảng các đối tượng nông hơn là một hệ thống phân cấp đối tượng sẽ hoạt động tốt. Nhưng nếu bạn kết thúc với * rất nhiều * mục trong mảng và bạn thường xuyên thực hiện thao tác "tìm id này", mỗi tra cứu mảng là O (N). Đặt đối tượng của bạn vào một cấu trúc băm thay vì làm cho tra cứu O (1) ... nhanh hơn đáng kể. –
Hoàn hảo! Cảm ơn bạn. –
Đối với bất kỳ ai tìm kiếm thêm tài liệu về chủ đề này, bạn có thể tham khảo http://redux.js.org/docs/FAQ.html#organizing-state-nested-data và các bài viết được liên kết ở đó. –