关于哪种方法更好的SQL-(mysql)问题

关于哪种方法更好的SQL-(mysql)问题,mysql,sql,database-design,Mysql,Sql,Database Design,我需要在我的数据库里放一些东西,这样我就可以检查学生们有哪些课程,但哪种方法更好 { Table1 Rows: studentID, lessonID, hasPerfectCourse, courseID, } 或 它们都做同样的事情,但我想知道哪一个性能更好 编辑 因此,如果学生通过了所有的考试,他将有一个完美的课程,并且只会得到一个课程ID,因此可以通过该课程ID获得所有课程 如果学生没有一门完美的课程,例如,他/她仍然有第一年的课程,而他/她在第三

我需要在我的数据库里放一些东西,这样我就可以检查学生们有哪些课程,但哪种方法更好

{

Table1
Rows: 
    studentID,
    lessonID,
    hasPerfectCourse,
    courseID,

}

它们都做同样的事情,但我想知道哪一个性能更好

编辑 因此,如果学生通过了所有的考试,他将有一个完美的课程,并且只会得到一个课程ID,因此可以通过该课程ID获得所有课程 如果学生没有一门完美的课程,例如,他/她仍然有第一年的课程,而他/她在第三年,还有一些第二年的课程 希望我能让自己理解,因为我不是解释某事的最佳人选:D /编辑 格里茨,
哈伦

我认为在大多数情况下,你必须思考:


更少的表=>更少的连接语句=>更好的性能

更少的表=>更少的连接=>更好的性能导致了“上帝表”反模式

我的意见是,您的目标是在设计中采用第五种标准形式,然后根据性能和架构考虑在适当的情况下取消标准化

简言之,将数据保存在一个表中是否会导致跨行(数据,而不是键)重复数据,或者将不同/离散实体的属性合并到一个表中


如果你真的担心“做对了”,请在网上阅读关于标准化的内容:)

我想你是在问如何设计表格,对吗

如果是这样,正确的做法是规范化数据库。规范化背后的关键思想是避免非关键数据的副本散布在数据库中。为此,我建议最规范化的做法可能是使用以下一组表:

CREATE TABLE students (id, ...);
CREATE TABLE courses  (id, ...);
CREATE TABLE schedules (student_id, course_id);
第三个表通常称为联接表,用于表示多对多关系。要查询给定学生正在学习的课程,您可以询问:

SELECT * FROM schedules WHERE schedules.student_id = :student_id;
SELECT * FROM schedules WHERE schedules.course_id = :course_id;
要查询报名参加给定课程的学生,您可以询问:

SELECT * FROM schedules WHERE schedules.student_id = :student_id;
SELECT * FROM schedules WHERE schedules.course_id = :course_id;

与fdaines相比,我建议更多的表=>更多的规范化=>更少的数据异常。我还要说,连接本身并不昂贵,特别是如果你有正确的索引;有更好的方法可以在不破坏数据完整性或使数据库难以查询的情况下提高性能。

通常,表越窄,性能越好。此外,您还应该担心以规范化的方式存储数据。这里有一篇文章将帮助您解决这个问题

您首先必须找出所有变量的依赖关系。根据这一点,然后创建一个新的db设计。例如,课程名称取决于课程id,学生名称取决于学生id。因此,不要将所有4个变量放在同一个表中,而是将它们分开。这减少了元组之间的冗余,也变得易于处理空值。这是第五范式。对这类表进行查询总是很容易的


当您必须对表进行索引时,它也很有用。因为具有空值的变量不能被索引。

等等,什么?大多数主要的RDBMS都能更好地处理很长很窄的表。意味着会有更多的人。我不能接受这个答案,我正在严格限制自己的否决权。但“上帝桌”肯定是好的,因为它有“上帝”这个词在里面?为了澄清我的立场,加入确实会带来额外的费用。然而,如此宽大的桌子将给存储引擎带来沉重打击。碎片、插入和更新期间的页拆分,等等。最后,您最好使用适当的设计、索引、非常有选择性的查询以及遵循其他最佳实践。这是一个OLTP数据库。你甚至不想用“更少的桌子”来思考。你想从“规范化结构”的角度来思考,如果你在上面实际命名了表和列,可能会更清楚。这个表的用途实际上是为了节省一些空间,一些学生有一个完美的课程,因此每个学生都将得到他们在特定年级所需要的所有课程。还有一些一年级的学生在二年级上的课,情况很复杂。