2016-07-06 22 views
12

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.

  1. 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.

  2. 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?

+1

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ể. –

+0

Hoàn hảo! Cảm ơn bạn. –

+0

Đố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 ở đó. –

Trả lời

12
  1. "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 và todos có cùng ID trong các mảng khác nhau có thể không đồng bộ."

Bạn có thể có TODO (ví dụ id 1) nằm trong danh sách "Người dùng TODO" và danh sách "TODO của Cục" cùng một lúc. Và sau đó nếu người dùng cập nhật việc cần làm của mình, thì TODO cũng phải được cập nhật trong danh sách "TODO của Bộ". Nếu dữ liệu của bạn được chuẩn hóa, TODO sẽ được cập nhật ở cả hai nơi (tốt, thực sự sẽ chỉ có một phiên bản của TODO được gọi đơn giản từ nhiều nơi). Nhưng nếu nó không được chuẩn hóa, bộ phận sẽ có một bản sao cũ của việc cần làm.

  1. "Tại sao giữ danh sách tất cả các id?"

Tôi nghĩ bạn nói đúng, trung thực. Nếu bạn định làm phiền bình thường hóa, sau đó sao chép danh sách các loại ID dường như chạy ngược lại nỗ lực đó.

Dù sao, tôi nghĩ trường hợp bình thường hóa dữ liệu trong React có thể phản ánh trường hợp bình thường hóa dữ liệu nói chung (ví dụ: trong cơ sở dữ liệu). Đó là một chút nỗ lực hơn lên phía trước, nhưng sự linh hoạt nó mang lại cho bạn thường là giá trị nó.

Ngoài ra, tôi không phải lúc nào cũng bình thường hóa mã Phản ứng của mình, nhưng tôi thấy rằng không phải là chuẩn hóa kết thúc làm cho mã của tôi sloppier theo thời gian. Tôi chỉ trở nên ít kỷ luật hơn. Tôi đoán nó giống như hiệu ứng cửa sổ bị vỡ. Trong mã không chuẩn hóa, tôi chỉ bắt đầu ném các giá trị vào những nơi mà họ thực sự có lẽ không nên đơn giản là ngoài sự tiện lợi.

+0

Cảm ơn. Bạn có thể vui lòng xem bản chỉnh sửa của tôi không? –

6

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ó?

Lưu trữ một mảng ID cho phép chúng tôi xác định thứ tự cho các mục. Trong khi các công cụ JS bây giờ có một quy trình khá chuẩn hóa để lặp qua các khóa trong một đối tượng, bạn không nên dựa vào đó để xác định thứ tự.

Answer thanks to markerikson

+0

Nhưng điều này sẽ được coi là thứ tự như thế nào? Cái tên 'allIds' không hoàn toàn cung cấp ngữ cảnh đó ... nếu nó đã làm nó sẽ giống như' allIdsSortedByName', được cho là đi ngang từ khái niệm 'bình thường hóa' – bitstrider

+0

Nó có thể là để biểu thị một khái niệm như 'allIdsSortedInTheOrderAUserPutThemIn'. Một cái gì đó giống như 'byName' có thể được suy ra tại thời gian chạy, nhưng nếu có một giao diện kéo và thả của một số loại thì thứ tự được định nghĩa theo cách riêng bởi người dùng, và không dựa trên bất kỳ khía cạnh nào của mỗi thực thể. –

Các vấn đề liên quan