【问题标题】:Little Database Performance Puzzle小数据库性能难题
【发布时间】:2012-05-22 04:30:20
【问题描述】:

我对数据库不是很有经验,但我有一个小问题。我正在尝试创建一个数据库来存储学生和讲师所学的课程,所以我创建了三个表。在讲师和学生表中,现场课程代表讲师或学生所学课程的逗号分隔列表。

类似这样的:

讲师 - 课程 - “1,2”

学生 - 课程 - “1,2,3”

课程 - 1 - “生物”

但是问题是,当我想根据他们的课程显示学生列表时,我必须搜索所有学生和课程并再次搜索以检查 csv 列表是否有指定的课程(这似乎有点多余的)。有没有另一种方法可以实现这个目标,比如通过关联/引用索引或其他方式?谢谢

【问题讨论】:

    标签: mysql performance database-design


    【解决方案1】:

    创建两个新表:

    student_courses(int student_id, int course_id)
    lecturer_courses(int lecturer_id, int course_id)
    

    现在,您可以为学生正在学习的每门课程和讲师正在教授的每门课程创建单独的行,假设您希望单独跟踪课程的交付情况,而不是参加课程。然后,当您想要进行与课程相关的分析时,您可以使用课程 ID 针对这些表编写查询。

    【讨论】:

      【解决方案2】:

      现场课程代表讲师或学生所学课程的逗号分隔列表

      包含csv list 的字段正在破坏First Normal Form (1NF) 并且存在各种问题,包括性能问题。将此字段拆分为单独的 Junction Table {StudentID, CourseID} 是您应该做的。

      【讨论】:

        【解决方案3】:

        不要存储像“1,2,3”这样的文本,而是存储几行:

        • 在名为“students”的表中,每个学生对应 1 行
        • 在名为“课程”的表中,每门课程对应 1 行

        然后创建另一个名为“student_in_course”的表,每个组合都有 1 行。

        然后对“lecturer_in_course”做同样的事情。

        【讨论】:

          猜你喜欢
          • 2010-09-18
          • 2022-01-03
          • 1970-01-01
          • 2012-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-16
          • 1970-01-01
          相关资源
          最近更新 更多