如何为学生/课程/成绩建模?

时间:2017-05-17 18:30:22

标签: database database-design foreign-keys relational-database primary-key

我希望有一个数据库,其中包含每个学生,他/她所参加的课程以及他/她为每个学生提供的成绩。

我目前的模特是:

STUDENT:
FIRST_NAME
姓氏
student_id PK

课程:
COURSE_NAME
course_id PK

GRADES
等级
student_id FK
course_id FK

问题是我无法加入学生和课程。可以将student_id添加为COURSE中的外键吗?最好的建模是什么?

1 个答案:

答案 0 :(得分:0)

任何两个表都可以有意义地加入。它显然不会给你你想要的行。请解释您想要的行: student_id 行ids学生的行和 course_id ids课程和..."?实际上,您需要为每个基表提供这样的谓词,否则无法使用数据库。你好像希望我们知道那些来自常识的东西。但是不清楚你想要哪些行加入并不能给你。

FK(外键)只是说某些列集的值也是某些其他列集的值。与每个约束一样,它遵循您希望在某种情况下放入每个表中的行以及可能出现的情况。因此,确定您希望能够请求哪些行,以及使用基表的某些查询是否返回它们,然后添加适当的基表。然后声明后续约束,包括FK,PK(主键)和& UNIQUE,因此DBMS可以防止不可能的更新。但请注意,查询不需要约束。查询表达式只使用基表名称,返回的行满足从基表谓词构建的谓词。

据推测,您需要的行&#34;学生 student_id 需要课程 class_id 。成绩可能是行 student_id 在课程 class_id &#34;中成绩的行。从成绩中投出成绩会给出行<34>学生 student_id 在课程 class_id &#34;中取得的成绩。但是,如果所有注册课程的学生都有成绩,那么这些只是你想要的行。

您可以使用谓词添加注册(student_id,class_id)&#34;学生 student_id 获取课程 class_id 。请注意,Grade中的一行必须是Enrollment中的一个子行,因此我们声明一个FK;这只是反映了这样一个事实:&#34;如果学生 student_id 在课堂上取得了一些成绩 class_id 那么 student_id 需要课程 class_id &#34;

或者您可以将Grade的谓词类似于&#34;学生 student_id class_id 类中成绩学生 student_id 需要课程 class_id 成绩 =&#39; n / a&#39;&#34;。然后,Enrollment的投影将为您提供所需的行。注意该谓词是如何相对复杂的。这是在SQL或其他特殊值中使用NULL的难点之一。

重新查询,请参阅this answer和/或this one(包括其链接)。