基本场景:我有需要存储在数据库中的学生、课程和课程需求。
有谁能洞察到存储这些和遍历课程先决条件的最佳方法?
1)简单的例子:
学生A完成数学100。如何确定他是否有资格通过数据库查询获得CS200?
2)更复杂的例子:
H 117
C: Chem 300,prereq: Chem 200,Chem 201,Chem 202H 218f 219
学生B完成化学100,化学200,化学203。你如何确认他是否有资格参加化学300课程?
如何对数据库中的先决条件层次结构进行建模?任何建议,链接,参考将是最欢迎的。
发布于 2010-11-11 01:38:23
有几件事你没有想过,比如在需要定义的实体中,这些都隐含在你的问题中。请允许我包括几个,但不要被他们分心,我是集中在你的问题。您现在可以安全地忽略Grade, Teacher
等,并为将来考虑它们。
给那些需要解释符号的人。
Requisite
的任何组合提供了包含可能的必要条件的完整列表--- `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代码来导航结构,请询问。
发布于 2010-11-10 23:31:54
我想下面这些都能做你想做的事:
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'))
如果上面的查询是为了检查一个学生是否已经成功地完成了所有课程,如果这个查询是为了返回学生没有参加的必修课,那么这个查询实际上会更容易一些,比如
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
请注意,这没有经过任何方式的测试,并且可能包含一些可怕的逻辑错误(例如,我对课程表的后期加入有点怀疑),但是它应该是有用的。或者引用哲学家普拉切特的话
没有在动物身上测试-你将是第一个!
分享并享受。
https://stackoverflow.com/questions/4149216
复制相似问题