Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库中的建模课程和先决条件_Sql_Database Design_Model - Fatal编程技术网

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

Sql 数据库中的建模课程和先决条件,sql,database-design,model,Sql,Database Design,Model,基本场景:我有需要存储在数据库中的学生、课程和课程要求 有人对存储这些信息和遍历课程先决条件的最佳方法有什么见解吗 1) 简单的例子: C:数学100,预要求:无 C:数学150,预要求:无 C:数学200,预科:数学101,数学150 学生A完成了数学100。如何通过数据库查询确定是否有资格使用CS200 2) 更复杂的例子: C:Chem 100,预需求:无 C:Chem 200,预需求:Chem 100 C:Chem 201,预需求:Chem 200 C:Chem 202,预需求:C

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

有人对存储这些信息和遍历课程先决条件的最佳方法有什么见解吗

1) 简单的例子:

  • C:数学100,预要求:无
  • C:数学150,预要求:无
  • C:数学200,预科:数学101,数学150
学生A完成了数学100。如何通过数据库查询确定是否有资格使用CS200

2) 更复杂的例子:

  • C:Chem 100,预需求:无
  • C:Chem 200,预需求:Chem 100
  • C:Chem 201,预需求:Chem 200
  • C:Chem 202,预需求:Chem 200
  • C:化学300,预需求:化学200,化学201,化学202中的任意两种
学生B完成了化学100、化学200、化学203。你如何检查他是否有资格服用化学300


如何在数据库中为先决条件层次结构建模?欢迎您提供任何建议、链接和参考。

我认为以下内容可以满足您的大部分需求:

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
选择c*
来自学生
内部连接课程学生\大学课程sc
ON(sc.ID\U学生=s.ID\U学生)
左外连接先决条件\课程pc
打开(pc.ID\U预请求\U课程=sc.ID\U课程)
内连接层c
开(c.ID\U课程=pc.ID\U课程)
其中s.ID\U STUDENT=和
c、 ID_课程=和
sc.COMPLETED='Y'和
sc.PASSED='Y'和
pc.ID\u预请求\u课程为空
请注意,这还没有经过任何测试,可能包含一些可怕的逻辑错误(例如,我对课程表的后期连接有点怀疑),但它应该是有用的入门工具。或者,引用哲学家普拉切特的话

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


分享和享受。

在你的问题中,很少有事情是你没有想到的,比如在需要定义的实体中。请允许我列举一些,但不要被它们分心,我的重点是你提出的问题。你现在可以放心地忽略分数、老师等,将来再考虑它们

对于那些需要解释符号的人

  • 除非需要,否则无需添加代理密钥,因为自然密钥变得太大,无法携带到孩子体内;我并没有盲目地在每张桌子上贴上PK的标签。无论如何,考虑的是物理层面,而不是逻辑层面

  • 我曾经为当地一所大学做过RDb模型。我认为除了“任意两个…”这样的先决条件外,您可能还需要“和至少一个…”,因此我提供了这些条件的任意组合

  • Requisite
    包含可能的Requisite的完整列表

    • IsMandatory
      确定满足“至少一项…”所需的必要条件;其余的不是,而是属于“任何两个…”

    • 等级
      允许根据需要指定最低等级 .

  • Course.NumRequisite
    标识所需的可能的
    必要条件的数量,如“任何两个中的…”

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

Swartz。您需要阅读答案并作出回应。感谢您提供的信息,发布SQL代码将非常有帮助,尤其是处理“至少一个”和“任意两个”的情况。更具体地说,我有一个与此相关的问题,如果您能看一看,我将不胜感激()。谢谢