Saya perlu melakukan sesuatu yang serupa beberapa waktu lalu, dan berikut ini menjelaskan apa yang akhirnya kami lakukan.
Kami memiliki dua tabel, Item dan UnfinishedItem. Ketika pengguna mengisi data dengan wizard, data disimpan dalam tabel UnfinishedItem. Pada setiap langkah panduan, server memvalidasi data yang dimasukkan selama langkah itu. Saat pengguna selesai dengan wizard, wizard merender formulir tersembunyi / baca-saja di halaman konfirmasi yang menunjukkan semua data untuk dikirimkan. Pengguna dapat meninjau halaman ini dan kembali ke langkah yang relevan untuk memperbaiki kesalahan. Setelah pengguna puas dengan entri mereka, pengguna mengklik kirim dan wisaya kemudian mengirimkan semua data di bidang formulir tersembunyi / baca saja ke server API. Ketika server API memproses permintaan ini, ia mengulangi semua validasi yang dilakukannya selama setiap langkah wizard, dan melakukan validasi tambahan yang tidak sesuai dengan langkah-langkah individual (misalnya validasi global, validasi mahal).
Keuntungan dari pendekatan dua tabel:
dalam database, Anda bisa memiliki batasan yang lebih ketat pada tabel Item daripada tabel UnfinishedItem; Anda tidak harus memiliki kolom opsional yang benar-benar diperlukan saat wisaya selesai.
Permintaan agregat di seluruh Barang jadi untuk pelaporan lebih mudah karena Anda tidak harus ingat untuk mengecualikan Item yang Belum Selesai. Dalam kasus kami, kami tidak pernah perlu melakukan permintaan agregat antara Item dan UnfinishedItems, jadi ini bukan masalah.
Kerugiannya:
- Ini rentan terhadap duplikasi logika validasi. Kerangka kerja web yang kami gunakan, Django, membuat ini sedikit lebih tertahankan karena kami menggunakan model pewarisan dengan sedikit meta magic untuk mengubah batasan yang kita butuhkan untuk menjadi berbeda dalam Item dan UnfinishedItem. Django menghasilkan sebagian besar basis data dan validasi formulir dari model, dan kita hanya perlu meretas beberapa validasi tambahan di atasnya.
Kemungkinan lain yang telah saya pertimbangkan dan mengapa kami tidak mengikuti mereka:
- menyimpan data dalam cookie atau penyimpanan lokal: pengguna tidak dapat melanjutkan pengirimannya dari perangkat lain atau jika mereka menghapus riwayat browser mereka
- menyimpan UnfinishedItem sebagai data yang tidak terstruktur (misalnya JSON) pada database atau data sekunder: Saya harus mendefinisikan parsing logic dan tidak dapat menggunakan validasi model / form otomatis Django.
- lakukan validasi per langkah di sisi klien: Saya harus menduplikasi logika validasi antara Python / Django dan JavaScript.