【问题标题】:Database choice for creating two connected tables?创建两个连接表的数据库选择?
【发布时间】:2015-04-10 14:12:22
【问题描述】:

我必须数据库表“课程”和“学生”。

  • 课程表有列(“_id”、“course_name”、“course_number”)。
  • 学生表有列(“student_name”、“student_number”、“course_number”)。

我已经创建了 Courses 表,但是我在创建 Student 表时遇到了问题。

两个班级可能有同一个学生,所以同一个学生行将存在两次,学生表中的"course_number"s 不同。我不想复制行。这样我也不能将"student_number" 设为primary key。因为对于多个类,它将存在两次。如何设计这个表,我不能将多个"course_number"s 放在同一列中。

【问题讨论】:

    标签: database database-design android-sqlite


    【解决方案1】:

    这是多对多的经典案例,为此,您需要在课程和学生之间建立第三个表。架构将如下所示:

    Course 表有列 ("course_id", "course_name")

    Student_course 表有列 ("student_id", "course_id");

    Student 表作为列(“student_id”、“student_name”)

    Student_course 表对学生表和课程表都有外键约束。

    示例数据:

    课程:

    id   |  name
    ------------------
    1    |  Maths
    2    |  English
    3    |  Science
    

    学生

    id   |  name
    ---------------
    1    |  Tom
    2    |  Dick
    3    |  Harry
    

    学生课程

    student_id | course_id
    ------------------------
    1          | 1
    1          | 2
    2          | 1
    3          | 3
    

    在本例中,学生 1 (Tom) 正在学习课程 1 和 2(数学、英语),

    学生 2(迪克)只上课程 1(数学)

    学生 3(Harry)只上课程 3(科学)

    【讨论】:

    • 所以 _id 是“课程”的主键,student_id 是“学生”表的主键? student_course 是否必须拥有主键?
    • student_course 有一个复合主键 - course_id AND student_id
    【解决方案2】:

    学生(身份证、姓名、编号) 课程(ID、姓名、编号) 学生课程 (student_id, course_id)

    你必须建立一个多对多的关系。

    【讨论】:

      【解决方案3】:

      课程和学生之间存在 m 对 n 的关系。 要映射 m 到 n 关系,您需要第三个表。

      courses_students
      ----------------
      id_student
      id_course
      
      courses
      ----------------
      id_course
      // other fields
      
      students
      ----------------
      id_student
      // other fields
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        相关资源
        最近更新 更多