Database 我应该创建两个表来存储对象的特定信息吗?

Database 我应该创建两个表来存储对象的特定信息吗?,database,database-design,Database,Database Design,我有一些桌子: 课程:包含有关课程的信息,一门课程有许多主题 主题:包含有关主题的信息,一个主题属于一门课程,一个主题有许多问题 问题:包含关于问题的信息,一个问题属于一个主题 GeneralExam:包含一门课程的考试信息,一次普通考试属于一门课程 一般问题:包含一般考试的设置问题 这是两个表的列: GeneralExam:名称、描述、学期、持续时间、用户id、课程id、已用(布尔)、编号\u问题 一般问题:一般考试id,问题id 将为将军解答问题Alexam是随机的。这意味着我会根据

我有一些桌子:

  • 课程:包含有关课程的信息,一门课程有许多主题
  • 主题:包含有关主题的信息,一个主题
    属于一门课程,一个主题
    有许多问题
  • 问题:包含关于问题的信息,一个问题
    属于一个主题
  • GeneralExam:包含一门课程的考试信息,一次普通考试属于一门课程
  • 一般问题:包含一般考试的设置问题
这是两个表的列:

  • GeneralExam:名称、描述、学期、持续时间、用户id、课程id、已用(布尔)、编号\u问题
  • 一般问题:一般考试id,问题id
将为将军解答问题Alexam是随机的。这意味着我会根据每个主题的具体问题数量随机提问

现在我想知道普通考试的具体信息,比如普通考试中每门课的题目数量。目前,我想我会创建一个新表来存储这些信息,比如:

  • 新表:一般考试id、主题id、编号问题
但我不知道这是不是最好的方法,或者在这种情况下,可能还有其他方法或模式需要解决。因为如果我创建那个新表,当我在GeneralExam表中进行更改(例如:更改集问题)时,我需要更新3个表:GeneralExam,GeneralQuestion,New table。我不确定这是不是好办法

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


或者我需要在GeneralQuestion表中做一些更改,以便更好地存储普通考试的信息,我应该做哪些更改?感谢您的建议和建议。

如果您想要的信息可以从当前数据中查询,一般来说,您应该而不是将其存储在另一个表中。原因是:每次从其他表中添加/删除行时,也必须更新此表。这样很容易造成数据不一致

对于您的示例(考试中给定主题的问题数量),您可以使用聚合轻松检索该信息:

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;

o如果要存储的数据不能从其余数据中推断出来,那么是的,最好将其存储在有意义的地方-如果它特定于对
(考试,主题)
,则存储在一个表上,该表将这两个值作为其值(即,正是您在问题中建议的方式)。无论是创建新表还是在现有表中添加这些列(当然,使用正确的候选键),这都是您的选择,我没有任何支持或反对这样做的理由。

我们试图说,创建新的额外表不需要这样做。您希望通过对表的最小接触来有效地管理模式

设计规则:

不应将特定教材中编号的主题与主题表的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
TBLQUOTE:虽然ID是索引,但TID是识别问题父项(主题)的工具

ID,TID,问题

tblExam:虽然ID是索引,但CID识别问题的父项(课程)

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、

课程编号=m122 日期=上一年/月/日期

这些是最符合逻辑/最重要的细节,将作为一个组合搜索键您需要从考试表中找到考试ID,并在ExamsQuestions bank中使用该ID提取考试问题

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
顺便说一句,既然你是随机选择考试的题目,我会非常担心如果我必须参加考试。贝卡
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