Tôi đã cần phải làm một cái gì đó tương tự một thời gian trước đây, và sau đây mô tả những gì chúng ta kết thúc với.
Chúng tôi có hai bảng, Item và UninishedItem. Khi người dùng điền dữ liệu vào trình hướng dẫn, dữ liệu sẽ được lưu trữ trong bảng UnlinishedItem. Ở mỗi bước của trình hướng dẫn, máy chủ sẽ xác thực dữ liệu được nhập trong bước đó. Khi người dùng kết thúc với trình hướng dẫn, trình hướng dẫn sẽ hiển thị biểu mẫu ẩn / chỉ đọc trong trang xác nhận hiển thị tất cả dữ liệu sẽ được gửi. Người dùng có thể xem lại trang này và quay lại bước liên quan để sửa lỗi. Khi người dùng hài lòng với các mục nhập của họ, người dùng nhấp vào gửi và trình hướng dẫn sau đó gửi tất cả dữ liệu trong các trường mẫu ẩn / chỉ đọc đến máy chủ API. Khi máy chủ API xử lý yêu cầu này, nó sẽ chạy lại tất cả các xác nhận mà nó đã thực hiện trong mỗi bước của trình hướng dẫn và thực hiện các xác nhận bổ sung không phù hợp với các bước riêng lẻ (ví dụ: xác thực toàn cầu, xác thực đắt tiền).
Ưu điểm của phương pháp hai bảng:
trong cơ sở dữ liệu, bạn có thể có các ràng buộc chặt chẽ hơn trên bảng Mục so với bảng UnlinishedItem; bạn không cần phải có các cột tùy chọn sẽ thực sự được yêu cầu khi trình hướng dẫn kết thúc.
Các truy vấn tổng hợp trên các Mục đã hoàn thành để báo cáo dễ dàng hơn vì bạn không cần phải nhớ để loại trừ các Phần chưa hoàn thành. Trong trường hợp của chúng tôi, chúng tôi không bao giờ cần thực hiện các truy vấn tổng hợp giữa Item và UnlinishedItems, vì vậy đây không phải là vấn đề.
Những bất lợi:
- Nó dễ bị trùng lặp logic xác thực. Khung web mà chúng tôi đã sử dụng, Django, làm cho điều này trở nên dễ chịu hơn một chút khi chúng tôi sử dụng tính kế thừa mô hình với một chút ma thuật meta để thay đổi các ràng buộc mà chúng tôi cần phải khác nhau trong Item và UnlinishedItem. Django tạo ra hầu hết các cơ sở dữ liệu và xác thực mẫu từ mô hình và chúng ta chỉ cần hack trong một vài xác nhận bổ sung trên đầu trang.
Các khả năng khác tôi đã xem xét và tại sao chúng tôi không đi với họ:
- lưu dữ liệu trong cookie hoặc bộ nhớ cục bộ: người dùng không thể tiếp tục gửi từ một thiết bị khác hoặc nếu họ xóa lịch sử trình duyệt của họ
- lưu trữ dữ liệu chưa hoàn thành dưới dạng dữ liệu phi cấu trúc (ví dụ JSON) trên cơ sở dữ liệu hoặc kho dữ liệu thứ cấp: Tôi sẽ phải xác định logic phân tích cú pháp và không thể sử dụng xác thực mẫu / biểu mẫu tự động của Django.
- thực hiện xác thực mỗi bước ở phía máy khách: Tôi sẽ phải sao chép logic xác thực giữa Python / Django và JavaScript.