0

次の要件を含む MySQL/cakePHP を使用してアプリケーションを構築しています。

  • 管理者は、ユーザーが完了する必要がある手順を作成します。例: はい/いいえタイプの質問。管理者はこれらの手順を作成し、新しいユーザーはそれらを取得する必要があります。

  • ユーザーは、ログオン時にこれらすべての手順を完了する必要があります。

私の質問は、データベース(mySQL)でこれを行う最良の方法は何ですか

  • ユーザーがサインアップすると、ステップ テーブルにクエリを実行し、そのユーザーの各ステップの新しい行を作成しますか? ステップテーブルを見て、サーバー側のコードから行を作成しますか?

  • リレーションシップに保存する新しい中間テーブルを作成しますか??

私はリレーショナル デザインについてはかなりの経験がありますが、これを行う最善の方法と将来の証明を同時に行うには少し困惑しています。

**Mock Structure**
Steps
id
name
order
desc


**Users**
id
username


**Step_Users**
step_id
user_id
result1
result2
result3
4

3 に答える 3

1

基本的に、あなたのテーブルは問題ありません。1 つのシナリオを次に示します。誰かがサインアップします。テーブルからすべての手順を実行しSteps、このフィールドを使用してフォームを作成します。ユーザーはフォームに入力して送信します。次に、それらの答えをstep_userテーブルに書き込みます。そして、どういうわけか、ユーザーが回答を完了したという情報を保持します(おそらく別のフィールドのどこかにあるか、step_userテーブルに彼の行があるかどうかを確認するだけです)。もちろん、正確なニーズに基づいて、これを処理するためのさまざまなアプローチがあります。詳細について言及されていないため、ここでさらに多くのシナリオについて言及できますが、それらが役立つかどうかはわかりません.
各ユーザーが各ステップで一意のデータを持っていることを確認したい場合は、テーブル step_user から、列 step_id および user_id に対して複合一意インデックスを作成する必要があります。http://www.w3schools.com/sql/sql_unique.aspですが、もちろん、これを確認するコードも必要です。

于 2013-03-12T13:09:33.460 に答える
0

これも私がこれを設計する方法です。後でさまざまな量のステップ (質問) に対応するために、質問ごとに 1 つのレコードとしてステップを保存し、Step_users テーブルに対して同じことを行います。

**Step_Users**
step_id
user_id
result

必要に応じて、ユーザーがすべての手順を完了したときに設定されるユーザー テーブルにフラグを追加できます。

于 2013-03-12T13:09:13.310 に答える
0

私はこのようにそれを分解します:

Stepsプロセスの各ステップに対して、テーブルに1 つの行があると思います。Usersシステム内のユーザーごとにテーブルに 1 つの行があります。したがって、Step_Usersテーブル内の行数は (rows in Steps) * (rows in Users) になります。

Usersであるテーブルにブール値を入れることをお勧めしますsteps_finished。そうすれば、users テーブルからプルするだけで、終了済みとしてマークされているかどうかをすぐに知ることができます。また、ステップに対する将来の変更は、必要な場合を除き、ユーザーには影響しません。

登録またはログインするときは、次の手順に従います。

  1. ユーザーが新しいアカウントを登録する: steps_finished= false または ユーザーがアカウントにログインします。
  2. = true の場合steps_finished、残りは無視してください。false の場合は続行します。
  3. システムはselect * from Step_Users where user_id=X order by step_id
  4. システムはselect * from Steps order by id
  5. 手順 3 の行を数えて、手順 2 の行と比較します。手順 2 の行にない手順 3 の行が見つかった場合は、その手順を示します。steps_finished(ステップ 3 からテーブル全体を取得し、ステップ 2 の行に欠落がない場合は、 set = true に進みます)

次のページの送信

  1. 彼らがそのステップの結果を出すと、select * from Step_Users where user_id=X and step_id=Y
  2. その結果が返された行が 0 として返された場合、以前にこのステップを送信していないことがわかります。`Step_Users (step_id, user_id, result1, result2, result3) 値 (X, Y, 'response1', 'response2', 'response3') に挿入
  3. 上記の手順 3 ~ 5 をもう一度実行します。

テーブル内の行を相互にチェックする理由はたくさんありますが、最大の理由は、ユーザーが途中でステップの実行を停止する可能性があり、開始した場所にすぐに戻る方法が必要になることです。

于 2013-03-12T13:09:48.203 に答える