Database 如何模拟学生/课程/成绩?

Database 如何模拟学生/课程/成绩?,database,database-design,foreign-keys,relational-database,primary-key,Database,Database Design,Foreign Keys,Relational Database,Primary Key,我想有一个数据库,其中包含每个学生,他/她正在参加的课程,以及他/她对每个学生的成绩 我目前的模式是: 学生: 名字 姓氏 学生idPK 课程: 课程名称 课程idPK 等级 等级 学生idFK 课程idFK 问题是我不能参加学生和课程。在课程中添加学生id作为外键可以吗?最好的建模方法是什么?任何两个表都可以有意义地连接起来。很明显,它不会给你想要的排数。请解释您想要的行:学生id标识为学生、课程id标识为课程的行,以及……?事实上,您需要为每个基表提供这样的谓词,否则数据库无法使用。您似

我想有一个数据库,其中包含每个学生,他/她正在参加的课程,以及他/她对每个学生的成绩

我目前的模式是:


学生:
名字
姓氏
学生id
PK

课程:
课程名称
课程id
PK

等级
等级
学生id
FK

课程id
FK



问题是我不能参加学生和课程。在课程中添加学生id作为外键可以吗?最好的建模方法是什么?

任何两个表都可以有意义地连接起来。很明显,它不会给你想要的排数。请解释您想要的行:学生id标识为学生、课程id标识为课程的行,以及……?事实上,您需要为每个基表提供这样的谓词,否则数据库无法使用。您似乎希望我们从常识中了解这些行。但不清楚您想要的是连接没有提供给您的行

FK(外键)只是说某些列集的值也是其他列集的值。这与每个约束一样,取决于您希望在某个情况下在每个表中放置哪些行,以及可能出现哪些情况。因此,请确定您希望能够请求哪些行,以及使用您拥有的基表的某个查询是否没有返回这些行,然后添加适当的e基表。然后声明后续约束,包括FKs、PKs(主键)和UNIQUE,这样DBMS可以防止不可能的更新。但请注意,查询不需要约束。查询表达式只使用基表名称,返回的行满足从基表谓词生成的谓词

大概您需要“学生id获取班级id”的行。成绩大概是“学生id获取班级id中的成绩”的行。从成绩中投影出成绩,给出“学生id在班级id中取得了一些成绩”的行。但是如果一个班级的所有学生都有分数,那么这些只是你想要的一行

您可以添加带有谓词“student-student-id获取class-id”的注册(student-id,class-id)。请注意,那么Grade中的一行必须是注册中的子行,因此我们声明了FK;这只是反映了“如果student-student-id在class-id中取得了某些成绩,则student-id获取class-id”这一事实

或者你可以改为让Grade的谓词类似于“学生id在class class id中取得了成绩,或者学生id取得了class id,而Grade='n/a'“。然后注册的投影将为您提供所需的行。注意这个谓词是如何相对复杂的。这是在SQL或其他特殊值中使用NULL的困难之一


重新查询see和/或(包括它们的链接)。

您需要第四个表。许多学生都可以选修这些课程。把它称为注册。从技术上讲,你可以把所有的信息塞进分数中,但你必须使用它们作为占位符,然后在课程结束时对它们进行变异。课程不能依赖于单个学生。请解释您想要的行:学生id标识为学生的行和课程id标识为课程的行以及。