2

私はいくつかのテーブルを持っています:

  • コース:コースに関する情報、1つのコースhas manyトピックが含まれます。
  • トピック:トピックに関する情報、1つのトピック、1belongs toつのコース、および1つのトピックのhas many質問が含まれます。
  • 質問:質問に関する情報、1つの質問、1belongs toつのトピックが含まれます。
  • GeneralExam:コースの試験、1つの一般試験belongs to1つのコースに関する情報が含まれています。
  • GeneralQuestion:一般試験の一連の質問が含まれています。

これは2つのテーブルの列です。

  • GeneralExam:名前、説明、学期、期間、user_id、course_id、使用済み(ブール値)、number_question
  • GeneralQuestion:general_exam_id、question_id

GeneralExamの質問はランダムです。これは、各トピックの特定の質問数に応じてランダムな質問を取得することを意味します。

ここで、一般試験を行ったコースの各トピックの質問数など、一般試験の具体的な情報を知りたいと思います。現在、その情報を保存するために、次のような新しいテーブルを作成すると思います。

  • 新しいテーブル:general_exam_id、topic_id、number_question

しかし、これがそれを行うための最良の方法であるかどうか、あるいはこの場合、解決する他の方法やパターンがあるかどうかはわかりません。その新しいテーブルを作成する場合、GeneralExamテーブルに変更を加えると(例:セットの質問を変更する)、GeneralExam、GeneralQuestion、Newテーブルの3つのテーブルを更新する必要があります。それが良い方法かどうかはわかりません。

ですから、その情報(一般試験の過程での各トピックの質問の数)を格納するための新しいテーブルを作成する必要があるかどうかを尋ねたいと思います。

または、一般試験のストア情報を改善するために、テーブルGeneralQuestionにいくつかの変更を加える必要がありますか?また、どのような変更を行う必要がありますか?提案やアドバイスをありがとう。

4

2 に答える 2

1

必要な情報が現在のデータからクエリできる場合、通常は別のテーブルに格納しないでください。その理由は、他のテーブルから行を追加/削除するたびに、これも更新する必要があるからです。そのようにして、データの不整合を作成するのは簡単です。

あなたの例(試験の特定のトピックの問題数)では、集計を使用してその情報を簡単に取得できます。

select q.topic_id, count(gq.question_id)
from topic t join question q          on t.id = q.topic_id
             join general_question gq on q.id = gq.question_id
where gq.general_exam_id = 10
group by q.topic_ic;

OTOH 保存したいデータが残りのデータから推測できない場合、はい、意味のある場所に保存することをお勧めします-ペアに固有の場合は、それらの2つの値を候補(exam, topic)として持つテーブルに保存しますキー(つまり、質問で提案した方法とまったく同じ)。新しいテーブルを作成するか、既存のテーブルにそれらの列を追加するか (もちろん、正しい候補キーを使用して)、それはあなたの選択です。そうすることに賛成も反対もありません。

于 2012-11-19T17:03:35.453 に答える
1

新しい追加テーブルを作成する必要はありません。テーブルへの影響を最小限に抑えてスキーマを効率的に管理したい。

設計規則:

特定のコースブックの番号付きトピックをトピックテーブルの ID 番号と混同しないでください。コースは必ずしも試験に属している必要はありません。コースに属していなければならないのは試験です。これまでのところ、設計は正しく行われています。試験のすべての問題を GeneralQuestion テーブルに保存していると仮定します。これは、過去の試験の問題バンクのような役割を果たします (試験モデレーターのみにアクセスを許可する近い将来のスケジュール試験を含む)。

GeneralQuestions テーブルの名前を ExamsQuestions に変更する方が理にかなっています。このバンクを使用して、デザインは 2 つの仮想問題タイプを作成します。バンクからの試験問題と、試験問題が質問テーブルを参照している問題テーブルからの問題です。これで、試験問題バンクに必要な参照キーが得られます。私の意見では、それは履歴テーブルです。確信が持てない最終的なテーブルは、理想的には、リアルタイム データを提供する格納されたクエリであるべきです。

主な質問: 過去/将来の各試験の問題を保存する予定はありますか? はいと言います。したがって、

私が提供した設計によると、日付は試験テーブルの非常に重要な列になります。試験テーブルには、日付とコース ID の両方が必要です。

以下は、テーブルスキーマを提案する方法です。

tblコース

ID、コース

ID  NAME
b105    biology 1st year
c323    chemistry 1st year
e120    english 1st year
m122    maths 1st year
m250    maths 2nd year
p302    physics 3rd year

tblTopic : ID はインデックスですが、CID はトピックの親 (コース) を認識するものです。

ID、CID、トピック

ID  CID     NAME
t1  m122    Algebra
t2  m122    Probability
t3  e120    Essay Writing
t4  p302    Optics
t5  b105    liver system
t6  b105    neural system
t7  p302    mechanics

tblQuestion : ID はインデックスですが、TID は質問の親 (トピック) を認識するものです

ID、TID、質問

tblExam : ID はインデックスですが、CID は質問の親 (コース) を認識するものです

ID, CID, Exam, Date

ID  TID     QUESTION
q1  t2  x
q10 t7  p
q11 t4  n
q12 t6  i
q13 t7  r
q14 t6  k
q2  t1  y
q3  t1  z
q4  t2  a
q5  t2  v
q6  t6  s
q7  t6  h
q8  t1  l
q9  t2  g

tblExamsQuestions : 外部キー : 試験 ID、問題 ID

ID、QID

ID  CID     EXAM    DATE
e1  b105    1st Year Biology Main Stream    June, 08 2012
e2  m122    1st Year Maths Elective     December, 20 2011
e3  b105    1st Year Biology Main Stream    February, 10 2012

アプリケーション: 誰かが 1 年生の数学コースの昨年の試験問題を取得したいと考えています。それをどのように照会しますか?試験 ID が自動インクリメントの場合、どの ID がどの試験であるかを知るのは非常に困難です。したがって、ここでは、コース ID と試験が開催された日付のみを使用して、特定のコース試験の問題を検索できます。それは仕事をするはずです->同じコースの試験が同じ日に複数回開催されない限り。その後、時間ごとにデータを保存することもできます。ID が 1、2、3 だけでなく、適切な試験 ID である試験 ID でクエリを実行するように試験テーブルの設計を変更する限り、日付、時刻を削除できます。

コースID = m122 日付 = 昨年/月/日

これらは、複合検索キーとして機能する最も論理的/重要な詳細であり、Exam テーブルから Exam ID を検索し、ExamsQuestions バンクでそれを使用して試験問題を取得するために必要です。

select * from question
where id in (
select eq.qid from examsquestions eq 
inner join exam e 
on e.id = eq.id
where e.date = '2011-12-20'
and e.cid = 'm122');

ID  TID     QUESTION
q1  t2  x
q5  t2  v
q7  t6  h

ところで、あなたは試験問題を無作為に選んでいるので、その試験を受けなければならないかとても心配です. 1 つのトピックからすべての質問を取得するリスクはかなり大きいためです。とにかく、それは副次的な問題であり、コースのすべてのトピックから試験を生成するための公平で公正なメカニズムあることを願っています;)

さらに疑問があれば聞かせてください。より良い解決策のアイデアを改善するために、どなたでも光を投げてください。

PS: お返事遅くなってすみません。

于 2012-11-19T20:49:24.787 に答える