【问题标题】:Database Design. Many to Many.What should be Primary Key?数据库设计。多对多。主键应该是什么?
【发布时间】:2017-04-07 12:40:51
【问题描述】:

我正在设计一个大学管理系统。我有 5 个表:Student、Teacher、Courses、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(在表 Available_Courses 中)主键,那么我将无法连接 Courses_Table,并且如果我在表 Available_Courses 中设置所有三个属性的复合键,那么一位教师可以一次又一次地注册相同的课程.制作两个属性的复合键,即teacher_id 和 course_id 将起作用,但会增加我的数据库中的重复,因为它们也将在 Courses_Taken 表中创建关系。

Courses_Taken Table 也是如此,因为我需要在出勤表中使用它的 PK(尚未制作)。

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

【问题讨论】:

  • 似乎 available_courses 包含教师教授课程的行。人们会期望可用的课程将是该表中某行中出现的课程。对你的问题如何定义你的表并不重要,你只需要告诉我们所持有的约束。 (CK、FD、FK)。

标签: database database-design relational-database relationship


【解决方案1】:

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)---/

【讨论】:

  • 我知道没有必要,但可以说需要添加另一个名为 Exam_Results 的表,我们将如何将其集成到此设计中。据我所知,我们需要在名为 Exam_Results 的新表中重复 student.id、teacher.id 和 course.id。除了重复还有其他方法吗?
  • @AzeemUllah 重复它们并没有。否则,您将在完全相同的地方重复ids。冗余不是数据出现两次而是说同样的事情两次
【解决方案2】:

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

哪些列集是唯一的,取决于表中的行对您的应用情况以及可能出现的应用情况的描述。

查询与“连接表”(无论是什么意思)或 CK 或 FK(外键)无关。查询要求根据基表行对应用情况的描述以及关系和逻辑运算符如何组合它们来构建关于应用情况的真实陈述的行。

如果列形成 CK 或 FK(即某些列列表的值的子行始终作为特定 CK 的子行值出现),那么我们会告诉 DBMS,以便它可以强制执行。这不会影响查询组合。

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

假设您使用 id,available_courses 有 CKs {available_courses_id} 和 {teacher_id, course_id} 并且 courses_taken 有 CKs {courses_taken_id} 和 {student_id, courses_available_id}。 (虽然你不需要 id。)

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多