建模数据库中的课程和先决条件

时间:2010-11-10 21:23:52

标签: sql database-design model

基本场景:我有需要存储在数据库中的学生,课程和课程要求。

任何人都可以深入了解存储这些内容并浏览课程先决条件的最佳方法吗?

1)简单的例子:

  • C:数学100,先决条件:无
  • C:数学150,先决条件:无
  • C:数学200,先决条件:数学101,数学150

学生A完成数学100.如何确定他是否有资格通过数据库查询获取CS200?

2)更复杂的例子:

  • C:Chem 100,prereq:none
  • C:Chem 200,先决条件:Chem 100
  • C:Chem 201,先决条件:Chem 200
  • C:Chem 202,先决条件:Chem 200
  • C:Chem 300,先决条件:Chem 200,Chem 201,Chem 202中的任何两个

学生B完成Chem 100,Chem 200,Chem 203.你如何检查他是否有资格参加Chem 300?

如何建模数据库中的先决条件层次结构?任何建议,链接,参考都是最受欢迎的。

2 个答案:

答案 0 :(得分:2)

在您的问题中隐含着一些您没有想过的事情,例如需要定义的实体。允许我包括一些,但不要被他们分心,我专注于你陈述的问题。您现在可以安全地忽略Grade, Teacher等,并考虑将来。

Typical Data Model for a College

IDEF1X Notation,适用于那些需要解释符号的人。

  • 除非需要代理密钥,否则无需添加代理密钥,因为自然密钥变得太大而无法传送给孩子;我没有在每张桌子上盲目地将它们标记为PK。无论如何,考虑的是物理的,而不是逻辑的。

  • 我曾为当地一所大学建立过RDb模型。我认为除了“任意两个......”之前的先决条件,你可能需要“并且至少有一个......”,所以我有提供任何组合。

  • Requisite包含可能必需品的完整列表

    • IsMandatory表示必须满足“至少其中一个......”;剩下的不是,而是落入“......中的任何两个......”

    • Grade允许将最低成绩指定为必需品 。

  • Course.NumRequisite标识所需的可能Requisites的数量,例如“任何两个的......” < / LI>

如果您需要SQL代码来导航结构,请询问。

答案 1 :(得分:0)

我认为以下内容可以完成你想要的大部分工作:

Table COURSE
  ID_COURSE    NUMBER         PRIMARY KEY
  DESCRIPTION  VARCHAR2(200)

Table PREREQUISITE_COURSE
  ID_COURSE         NUMBER    REFERENCES COURSE.ID_COURSE
  ID_PREREQ_COURSE  NUMBER    REFERENCES COURSE.ID_COURSE
  PRIMARY KEY (ID_COURSE, ID_PREREQ_COURSE)

Table STUDENT
  ID_STUDENT        NUMBER    PRIMARY KEY

Table STUDENT_COURSE
  ID_STUDENT        NUMBER    REFERENCES STUDENT.ID_STUDENT
  ID_COURSE         NUMBER    REFERENCES COURSE.ID_COURSE
  COMPLETED         CHAR(1)   CHECK(IN('Y', 'N'))
  PASSED            CHAR(1)   CHECK(IS NULL OR IN ('Y', 'N'))

鉴于以上查询,以检查学生是否已成功完成所有课程以获取某一课程,如果编写查询以返回学生未参加的必修课程,实际上会更容易 - 例如< / p>

SELECT c.*
  FROM STUDENT s
INNER JOIN COURSE STUDENT_COURSE sc
  ON (sc.ID_STUDENT = s.ID_STUDENT)
LEFT OUTER JOIN PREREQUISITE_COURSE pc
  ON (pc.ID_PREREQ_COURSE = sc.ID_COURSE)
INNER JOIN COURSE c
  ON (c.ID_COURSE = pc.ID_COURSE)
WHERE s.ID_STUDENT = <id of student of interest> AND
      c.ID_COURSE = <id of course of interest> AND
      sc.COMPLETED = 'Y' AND
      sc.PASSED = 'Y' AND
      pc.ID_PREREQ_COURSE IS NULL

请注意,这尚未经过任何方式的测试,并且可能包含一些可怕的逻辑错误(例如,我对COURSE表的后期连接有点怀疑)但它应该是有用的东西用。或者,引用哲学家Pratchett

未在动物身上进行测试 - 您将成为第一个!

分享并享受。