我们想说的是,这不是创建新的额外表所必需的。您希望通过对表的最少接触来有效地管理您的模式。
设计规则:
不应将特定教科书中的编号主题与主题表的 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:抱歉回复晚了。