0

现在我的网站有 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)

Grades* 表,它基本上是 3 个主键和一个值。这似乎有些奇怪。有没有更好的办法?学生表也是如此。两者基本上都是其他表的连接。快速搜索的主键是不可能的?

原帖:

重新创建它以利用 MySQL 的强大功能的最有效方法是什么?

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

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

4

1 回答 1

2

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

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

仅使用一组固定的表名的一个好处是您可以在 PHP 代码中使用准备好的语句?,使用占位符(通常是)而不是实际值。您可以在执行查询时传递值,服务器将确保它们正确转义。这可以防止大多数SQL 注入攻击问题。此外,使用不同的值重复执行相同的预处理语句可能会提高性能,因为查询必须被解析、分析和优化一次。

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

于 2012-11-06T06:21:07.273 回答