学校网站的MySQL表格

时间:2012-11-06 04:29:58

标签: php mysql sql phpmyadmin

现在我的网站有40多个表格,我认为我没有使用MySQL来完全正确。我正在建立一个类似于Moodle的网站。它基本上只是为按课程分组的学生进行测试。

原创表格

courses - Lists all courses (ID, Name)
c_$id   - Lists all the Tests (ID, Name, etc) for course number $id
a_$id   - Lists all questions for the test number $id (Question, A, B, C, D)
g_$id   - Lists all grades for the course with course number $id.
c_a     - Lists course ID and assignment ID pairs ex: (1,2) (1,3) (2,2) (2,3)

表格修订版1:

courses   - Lists all courses (ID, Name, etc)
tests     - Lists all tests (ID, Name, etc)
questions - Lists all questions from all tests (ID, Ques, Ans)
grades*   - Lists all grades (studentID, courseID, testID, grade)
students* - Lists all students and their courses (StudentID, courseID)

成绩*表,它基本上是3个主键和一个值。有点奇怪。有没有更好的办法?同样适用于学生表。两者基本上都是其他表的连接。无法快速搜索的主键?

Origonal Post:

利用MySQL的强大功能重建这个的最有效方法是什么?

截至目前,在制作新课程时,它会为该课程创建一个新表格(c_$id),然后为每个作业创建一个表格以及该课程的成绩列表g_$id。然后,在创建作业时,它会创建一个新的a_$id表格,将该课程和作业对添加到c_a

我从大多数select语句中删除了“*”,并将“LIMIT 1”添加到任何选择主键的位置,接下来是解决此OOP问题。

1 个答案:

答案 0 :(得分:2)

在一般情况下,最好在可能的情况下坚持使用静态方案(即一组固定的表和列)。因此,不是将连接编码到表名中,而是使用单独的列来引用其他表。例如,不是单独的c_$id 包含每个课程的测试,而是tests ,其中包含course_id 。输入测试时,您需要填写course_id值以表示此测试属于哪个课程。检索数据时,您可以

SELECT …
FROM courses, tests
WHERE courses.id = tests.course_id

仅使用一组固定的表名称的一个好处是,您可以在PHP代码中使用prepared statements,使用占位符(通常为?)而不是实际值。当您pass values查询时,您可以execute,服务器将确保他们正确escaped。这可以防止大多数SQL injection attack问题。此外,使用不同的值重复执行相同的预准备语句可能会带来性能提升,因为查询必须进行解析,分析和优化,但只需一次。

LIMIT 1添加到只能返回单行的查询中不太可能产生任何性能提升:MySQL优化器知道主键,因此它也能说明这一事实。由于这些行可能使您的查询稍微难以阅读和维护,请考虑再次省略它们。