首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库中的建模课程和先决条件

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

Stack Overflow用户
提问于 2010-11-10 21:23:52
回答 2查看 2.5K关注 0票数 2

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

有谁能洞察到存储这些和遍历课程先决条件的最佳方法?

1)简单的例子:

  • C:数学100,prereq:无
  • C:数学150,prereq: none
  • C:数学200,prereq:数学101,Math 150

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

2)更复杂的例子:

  • C: Chem 100,prereq: none
  • C: Chem 200,prereq: Chem 100
  • C: Chem 201,prereq: Chem 200
  • C: Chem 202,prereq: Chem 200

H 117C: Chem 300,prereq: Chem 200,Chem 201,Chem 202H 218f 219

学生B完成化学100,化学200,化学203。你如何确认他是否有资格参加化学300课程?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-11 01:38:23

有几件事你没有想过,比如在需要定义的实体中,这些都隐含在你的问题中。请允许我包括几个,但不要被他们分心,我是集中在你的问题。您现在可以安全地忽略Grade, Teacher等,并为将来考虑它们。

给那些需要解释符号的人。

  • 没有必要添加替代键,除非它们是必需的,因为自然密钥变得太大,无法携带到孩子中;我没有在每一张桌子上盲目地将它们标记为PK。在任何情况下,考虑都是在物理层面,而不是逻辑层面。
  • I曾为当地一所大学建立RDb模型。我认为,除了诸如“任意两个.”之类的先决条件之外,您可能需要“和至少一个.”,所以我已经为those.
  • Requisite的任何组合提供了包含可能的必要条件的完整列表--

代码语言:javascript
运行
复制
- `IsMandatory` identifies that the Requisite is Madatory required to fulfil the _"at least one of ..."_; the remainder are not, and fall into the _"any two of ..."_
- `Grade` allows a minimum Grade to be specified as requisite .  

  • Course.NumRequisite标识所需的可能的Requisites号,如“任意2 of .”

中所示

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

票数 3
EN

Stack Overflow用户

发布于 2010-11-10 23:31:54

我想下面这些都能做你想做的事:

代码语言:javascript
运行
复制
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'))

如果上面的查询是为了检查一个学生是否已经成功地完成了所有课程,如果这个查询是为了返回学生没有参加的必修课,那么这个查询实际上会更容易一些,比如

代码语言:javascript
运行
复制
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

请注意,这没有经过任何方式的测试,并且可能包含一些可怕的逻辑错误(例如,我对课程表的后期加入有点怀疑),但是它应该是有用的。或者引用哲学家普拉切特的话

没有在动物身上测试-你将是第一个!

分享并享受。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4149216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档