现在我的网站有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问题。
答案 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优化器知道主键,因此它也能说明这一事实。由于这些行可能使您的查询稍微难以阅读和维护,请考虑再次省略它们。