复合主键约束

时间:2015-04-17 04:14:44

标签: sql database-design rdbms composite-key

表格定义:

Student(StudentID, StudentName) PK StudentID

Faculty(FacultyID, FacultyName) PK FacultyID

Course(CourseID, CourseName) PK CourseID

Qualified(FacultyID, CourseID, DateQualified) PK FacultyID CourseID

Section(SectionNo,Semester, CourseID) PK SectionNo Semester CourseID

Registration(StudentID, SectionNo, Semester) PK StudentID SectionNo Semester

如何链接表注册和部分? 注册中的StudentID作为外键引用学生表中的StudentID 但是我可以用SectionNo和Semester做什么?我可以在外键Section_Semester(SectionNo,Semester)上添加约束,但这两个属性在Section表中不是唯一的。在Section表中添加主键约束?

由于

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你说你的Section表有一个主键(sectionNo,semester,courseID),那么因此可以有多个具有相同sectionNo和semester的记录?然后你想将没有courseID的Registration连接到这个表?据我所知,您不能使用“references”子句,因为它不会链接到唯一标识符。但这并不能阻止你编写加入这两个表的查询。

更新

当然,根据您想知道的内容,有许多可能的查询。例如,如果你想知道学生#17曾经注册过的所有课程,你可以写下:

select section.sectionno, section.semester, section.courseid
from registration
join section on section.sectionno=registration.sectionno 
  and section.semester=registration.semester 
where studentid=17

如果您想要给定注册记录的所有课程:

select coursed
from registration
join section on section.sectionno=registration.sectionno
  and section.semester=registration.semester
where registration.sectionno=@section
  and registration.semester=@semester
  and registration.studentid=@student

现在,嗯,写下这个查询,这表明学生注册了构成一个部分和一个学期的所有课程。这是真的?如果一个部分和一个学期有多门课程,学生是否一次注册所有课程,还是选择个别课程?如果他选择,那么注册似乎需要指定哪个课程。

我不知道“部分”在这里是什么意思所以我不知道它是如何相关的。

答案 1 :(得分:0)

我没有看到如何在没有CourseID的情况下拥有一个完整的注册元组。如果SectionNo和Semester的组合不是唯一的,那么学生注册了什么?学期的所有指定部分?不,他们注册特定课程(在特定时间在指定时间在指定时间开会)。

当然,我不知道 Section 代表什么。但无论它代表什么,它显然没有粒度来缩小学生注册的确切内容。你必须包含它。