现在我有我的网站的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个主键和一个值。好像有点奇怪。有更好的办法吗?学生桌也是如此。这两者基本上都是其他表的连接。快速搜索的主键是不可能的?
猎户座邮政:
什么是最有效的方法来重新利用MySQL的功能?
现在,当一门新的课程被设置时,它为该课程创建了一个新的表(c_$id),然后为每个作业创建了一个表,并为该课程创建了一个g_$id成绩列表。然后,在创建赋值时,它会创建一个新的a_$id表,将该过程和分配对添加到c_a中。
我从大多数select语句中删除了"*“,并将"LIMIT 1”添加到选择主键的任何语句中,接下来是解决OOP问题。
发布于 2012-11-06 06:21:07
在gerneral中,最好在可能的情况下坚持静态方案(即一组固定的表和列)。因此,不要将连接编码到表名中,而是使用单独的列来引用其他表。例如,您将拥有一个带有c_$id列的tests表,而不是分别保存每个课程的测试的course_id表。当输入测试时,您将填写course_id值,以表示该测试属于哪个课程。在检索数据时,可以
SELECT …
FROM courses, tests
WHERE courses.id = tests.course_id只使用一组固定的表名的好处之一是,您可以在PHP代码中使用准备好的陈述,使用占位符(通常是?)而不是实际值。您可以在查询传递值时使用执行,服务器将确保它们正确地获取转义。这防止了大多数SQL注入攻击问题。此外,使用不同的值重复执行相同的准备语句可能会提高性能,因为查询必须只进行一次分析、分析和优化。
将LIMIT 1添加到只能返回单个行的查询不太可能带来任何性能提高: MySQL优化器知道主键,因此它也可以告诉这个事实。由于这些行可能会使您的查询更难阅读和维护,因此请考虑再次忽略它们。
https://stackoverflow.com/questions/13244406
复制相似问题