基本场景:我有需要存储在数据库中的学生,课程和课程要求。
任何人都可以深入了解存储这些内容并浏览课程先决条件的最佳方法吗?
1)简单的例子:
学生A完成数学100.如何确定他是否有资格通过数据库查询获取CS200?
2)更复杂的例子:
学生B完成Chem 100,Chem 200,Chem 203.你如何检查他是否有资格参加Chem 300?
如何建模数据库中的先决条件层次结构?任何建议,链接,参考都是最受欢迎的。
答案 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
未在动物身上进行测试 - 您将成为第一个!
分享并享受。