0

ユーザーがオンライン試験を受けることができる Web アプリがあります。

試験管理者がアンケートを作成します。アンケートには多くの質問を含めることができます。各質問は複数選択質問 (MCQ) です。

管理者が 10 個の質問を含むアンケートを作成するとします。ユーザーはそれらの質問を試みます。現在、実際の試験とは異なり、ユーザーは 1 つの質問票を複数回試すことができます。そして、彼のすべての試みを追跡する必要があります。

例えば

    User_id     Questionnaire_id    question_id answer  attempt_date    attempt_no
1       1           1       a   1 June 2013 1
1       1           2       b   1 June 2013 1

1       1           1       c   2 June 2013 2
1       1           2       d   2 June 2013 2

ユーザーが同じアンケートを 2 回試行した後、管理者は同じアンケートから質問を削除できますが、ユーザーの試行履歴には引き続き参照が必要であり、管理者が削除したにもかかわらず、ユーザーは自分の試行履歴でその質問を見ることができます。その質問。

ユーザーがこの変更されたアンケートを試みると、1 つの質問のみが表示されます。

    User_id     Questionnaire_id    question_id answer  attempt_date    attempt_no
1       1           1       a   3 June 2013 3

また、このユーザーが問題の一部を変更した後、ユーザーの試行履歴には変更前の質問が表示され、新しい試行には変更された質問が表示されます。

これをデータベース レベルでどのように管理するのでしょうか。

私の最初の直感は、

削除の場合は、物理的な削除は行わず、質問を非アクティブにして、履歴がユーザーの試行を引き続き追跡できるようにします。

変更するには、問題のバージョンを作成し、新しい試行ごとに各問題の最新バージョンを参照し、履歴を試行時の問題のバージョンへの参照を保持します。

4

1 に答える 1

3

(申し訳ありませんが、「質問票」の代わりに「試験」を使用しました。後者は、私の図では扱いにくい名前です。)

はい、何らかのバージョン管理を行う必要があります。オブジェクトを単独でバージョン管理するのは簡単ですが、オブジェクト間のリンクをバージョン管理すると、急に複雑になる可能性があります。(比較的) シンプルにするには、次のようにします。

ここに画像の説明を入力

これは階層を形成し、変更に応じてボトムアップ方式でバージョン管理できます。

  • 回答のテキストの変更、回答の追加または削除、または質問のテキストの変更は、質問の変更と見なされます。
  • これは、問題の追加または削除とともに、試験の変更と見なされます。
  • これは、新しい試験バージョンを作成し、適切な変更を適用しながら古い試験バージョンの下に完全なツリーをコピーすることによって行われます。

このバージョン管理への「階層的」アプローチ、つまり、ツリー ノードの変更に応じてツリー全体の新しいバージョンを作成する方法は、少し無駄が多いかもしれませんが、推論して実装するのはかなり簡単です。

別の方法として、子オブジェクトとリンクを明示的にバージョン管理し、慎重にクエリを実行して、特定の「時間内のスナップショット」のみが取得されるようにすることもできます。これには明らかに、大幅に異なるデータベース スキーマが必要になります...


上記に加えて、識別関係とその結果の複合主キーの驚異的な使用法に気付くでしょう。これは、USER_ANSWER を底とするひし形の依存関係を正しくモデル化するために必要であるため、ユーザーは試験に属さない回答を提供できません。

QUESTION.ANSWER_NO は、正しい答えを特定するのに役立ちます (これはMATCH SIMPLE外部キーを想定しています -この投稿も参照してください)。

ATTEMPT.TIMESTAMP は、ユーザーが試行を開始した日時です。個々の回答が与えられた時刻と合わせて、完全な「タイムライン」を再現できます。試験時間は、試行開始から最後の解答までの期間です。

USER_ANSWER.ANSWER_NO は主キーの外部に保持されるため、同じ試行で同じ質問に対して 2 つの異なる回答を提供することはできません。

DELETED フラグは、試験自体ではなく、試験バージョンに存在するため、試験の削除を取り消すと、その履歴記録が残ります。同じ検査を複数回削除および復元することもできます。

于 2013-05-26T20:44:43.927 に答える