小数据库性能难题

时间:2012-05-14 16:43:14

标签: mysql performance database-design

我对数据库没有多少经验,但我有一点问题。我正在尝试创建一个数据库,存储学生和讲师正在学习的课程,所以我创建了三个表。在讲师和学生表中,实地课程代表了讲师或学生所用课程的逗号分隔列表。

这样的事情:

  

讲师 - 课程 - “1,2”

     

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

     

课程 - 1 - “生物”

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

3 个答案:

答案 0 :(得分:4)

  

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

包含csv list的字段正在中断First Normal Form (1NF),并且存在各种问题,包括性能问题。将此字段分解为单独的连接表{StudentID, CourseID}是您应该做的。

答案 1 :(得分:4)

创建两个新表:

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

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

答案 2 :(得分:2)

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

  • 每个学生名为“students”
  • 的表中的一行
  • 名为“courses”
  • 的表中每个课程的一行

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

然后为“lecturer_in_course”做同样的事。