2

我有一些表:

  • 课程:包含有关课程的信息,一个课程has many主题。
  • 主题:包含有关主题的信息,一个主题belongs to一门课程和一个主题has many问题。
  • 问题:包含有关问题的信息,一个问题belongs to一个主题。
  • GeneralExam:包含有关课程考试的信息,一门普通考试belongs to一门课程。
  • GeneralQuestion:包含一般考试的设置问题。

这是两个表的列:

  • GeneralExam:名称、描述、学期、持续时间、user_id、course_id、使用(布尔)、number_question
  • 一般问题:general_exam_id,question_id

GeneralExam 的题目是随机的。这意味着我会根据每个主题的具体问题数量获得随机问题。

现在我想知道一般考试的具体信息,比如参加了一般考试的课程中每个主题的题数。目前,我想我将创建一个新表来存储该信息,例如:

  • 新表:general_exam_id、topic_id、number_question

但我不知道这是否是最好的方法,或者在这种情况下,有其他方法或模式可以解决。因为如果我创建那个新表,当我在 GeneralExam 表中进行更改(例如:更改集问题)时,我将需要更新 3 个表:GeneralExam、GeneralQuestion、新表。我不确定这是不是好方法。

所以我想问,我是否应该创建新表来存储该信息(普通考试中每个主题的问题数),

或者我是否需要在 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,如果您要存储的数据无法从其余数据中推导出来,那么是的,最好将其存储在有意义的地方 - 如果它特定于 pair (exam, topic),那么在具有这两个值作为其候选值的表上键(即完全按照您在问题中建议的方式)。是创建一个新表还是在现有表中添加这些列(当然,使用正确的候选键),这是你的选择,我没有任何支持或反对这样做的论据。

于 2012-11-19T17:03:35.453 回答
1

我们想说的是,这不是创建新的额外表所必需的。您希望通过对表的最少接触来有效地管理您的模式。

设计规则:

不应将特定教科书中的编号主题与主题表的 ID 号混淆。课程不一定必须属于考试。必须属于课程的是考试。到目前为止,您的设计是正确的。我假设您将所有考试问题存储在 GeneralQuestion 表中,该表的作用类似于过去考试的题库(包括在不久的将来安排考试,仅允许考试主持人访问)。

将 GeneralQuestions 表重命名为 ExamsQuestions 更有意义。使用这个银行,您的设计会制作两种虚拟问题类型:来自银行的考试问题和来自问题表的问题,其中考试问题引用您的问题表。这样就可以为您提供考试题库所需的参考密钥。在我看来,这是一个历史表。看起来,您不确定的最终表格理想情况下应该只是提供实时数据的存储查询。

主要问题:您是否打算存储每个过去/预定未来考试的问题?你说是。因此,

根据我提供的设计,日期在您的考试表中变得非常重要。您需要考试表中的日期和课程 ID。

以下是我建议表模式的方式。

tbl课程

身份证,课程

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  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

申请:有人想获得去年数学一年级课程的试题。你怎么查询?如果考试 ID 是自动递增的,那么很难知道哪个 id 是什么考试。因此,您可以在此处仅使用课程 ID 和举行考试的日期来搜索特定课程考试的问题。那应该可以完成工作->除非同一课程考试在同一天举行多次。然后您也可以按时间保存数据。只要您将考试表设计更改为按考试 ID 查询,您就可以删除日期、时间,其中 ID 是正确的考试 ID,而不仅仅是 1、2、3...

课程 ID = m122 日期 = 去年/月/日

这些是最合乎逻辑/最重要的详细信息,它们将用作COMPOSITE SEARCH KEY,您需要从考试表中找到考试 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

顺便说一句,因为你是随机选择考试的问题 - 如果我必须参加那次考试,我会很担心。因为从一个主题中获得所有问题的风险非常广泛。无论如何,这是一个附带问题,我希望你有一个公正但公平的机制来从课程的所有主题生成考试;)

如果您还有其他疑问,请告诉我。任何人都请提出一些想法,以改进想法以获得更好的解决方案。

PS:抱歉回复晚了。

于 2012-11-19T20:49:24.787 回答