数据库设计。多对多。什么应该是主键?

时间:2016-11-23 13:16:38

标签: database database-design relational-database relationship

我正在设计一个大学管理系统。我有5个表:学生,教师,课程,Available_Courses和Taken_Courses。

Student:
    student_id (PK)

Teacher:
    teacher_id (PK)

Courses:
    courses_id (PK)

Available_Courses:
    available_courses_id
    teacher_id
    course_id

Courses_Taken:
    courses_taken_id
    student_id
    courses_available_id

在Available-Courses和Courses_Taken表中应该有什么PK?

如果我没有使用available_courses_id(在Table Available_Courses中)主键,那么我将无法连接Courses_Table,如果我在表Available_Courses中创建所有三个属性的Composite键,那么一个教师可以一次又一次地注册相同的课程。制作两个属性的复合键,即teacher_id和course_id将起作用,但会增加我的数据库中的重复,因为它们也将在Courses_Taken表中创建关系。

与Courses_Taken表相同,因为我需要在表中使用它的PK出席(尚未制作)。

那么在这种情况下应该怎么做?

2 个答案:

答案 0 :(得分:0)

available_coursescourses_taken表中不需要人工密钥,只需使用两个外键的组合作为主键:

student
    id          int unsigned(P)

teacher
    id          int unsigned(P)

course
    id          int unsigned(P)

available_courses
    teacher_id  int unsigned (F teacher.id)--\__(P)
    course_id   int unsigned (F course.id)---/

courses_taken
    student_id  int unsigned (F student.id)--\__(P)
    course_id   int unsigned (F course.id)---/

答案 1 :(得分:0)

CK(候选键)是表中唯一的一组列,不包含较小的唯一列集。一个CK可以称为PK(主键)。

哪些列集是唯一的取决于表的行对应用情况的说明以及可能出现的应用情况。

查询与“连接表”(无论这意味着什么)或CK或FK(外键)无关。查询要求提供关于应用程序情况的真实语句的行,这些语句基于哪些基表行说明应用程序情况以及关系和逻辑运算符如何组合它们。

如果列形成CK或FK(即某些列列的值的子行总是作为特定CK的子行值存在),那么我们告诉DBMS它可以强制执行该操作。这不会影响查询组合。

错误本身没有重复值。冗余不是关于数据出现两次,而是说两次相同的事情。不需要引入id列而不是自然键。这只是在完全相同的地方重复 id

假设您使用ID,则available_courses具有CK {available_courses_id}& {teacher_id,course_id}和courses_taken有CKs {courses_taken_id}& {student_id,courses_available_id}。 (虽然你不需要ids。)