私はこのようにそれを分解します:
Steps
プロセスの各ステップに対して、テーブルに1 つの行があると思います。Users
システム内のユーザーごとにテーブルに 1 つの行があります。したがって、Step_Users
テーブル内の行数は (rows in Steps
) * (rows in Users
) になります。
Users
であるテーブルにブール値を入れることをお勧めしますsteps_finished
。そうすれば、users テーブルからプルするだけで、終了済みとしてマークされているかどうかをすぐに知ることができます。また、ステップに対する将来の変更は、必要な場合を除き、ユーザーには影響しません。
登録またはログインするときは、次の手順に従います。
- ユーザーが新しいアカウントを登録する:
steps_finished
= false または ユーザーがアカウントにログインします。
- = true の場合
steps_finished
、残りは無視してください。false の場合は続行します。
- システムは
select * from Step_Users where user_id=X order by step_id
- システムは
select * from Steps order by id
- 手順 3 の行を数えて、手順 2 の行と比較します。手順 2 の行にない手順 3 の行が見つかった場合は、その手順を示します。
steps_finished
(ステップ 3 からテーブル全体を取得し、ステップ 2 の行に欠落がない場合は、 set = true に進みます)
次のページの送信
- 彼らがそのステップの結果を出すと、
select * from Step_Users where user_id=X and step_id=Y
- その結果が返された行が 0 として返された場合、以前にこのステップを送信していないことがわかります。`Step_Users (step_id, user_id, result1, result2, result3) 値 (X, Y, 'response1', 'response2', 'response3') に挿入
- 上記の手順 3 ~ 5 をもう一度実行します。
テーブル内の行を相互にチェックする理由はたくさんありますが、最大の理由は、ユーザーが途中でステップの実行を停止する可能性があり、開始した場所にすぐに戻る方法が必要になることです。