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

时间:2011-07-14 14:07:03

标签: mysql sql database-design

我需要在我的数据库中添加一些内容,以便我可以检查学生他们有哪些课程,但哪种方法更好

{

Table1
Rows: 
    studentID,
    lessonID,
    hasPerfectCourse,
    courseID,

}

{

Table1
Rows: 
    studentID,
    lessonID 

Table2
Rows: 
    studentID,
    hasPerfectCourse,
    courseID

}

他们都做同样的事情,但我想知道哪一个更适合表现

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

5 个答案:

答案 0 :(得分:4)

less tables =>的概念less joins =>更好的表现导致了“神桌”的反模式。

我的观点是你的目标是设计中的第5种正常形式,然后根据性能和架构考虑因素进行适当的去标准化。

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

如果您真的担心“正确”,请在网上阅读有关规范化的内容:)

答案 1 :(得分:0)

我想你问的是如何设计表格,这是正确的吗?

如果是这样,正确的做法是规范化数据库。规范化背后的关键思想是避免在数据库周围传播非关键数据的副本。为此,我建议最常规化的事情可能就是拥有这组表:

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;

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

答案 2 :(得分:0)

通常,较窄的表格会表现得更好。此外,您应该担心以标准化方式存储数据。这篇文章将帮助您解决问题http://www.edbarlow.com/document/optimize.htm

答案 3 :(得分:0)

首先必须弄清楚所有变量的依赖关系。然后根据您创建一个新的数据库设计。例如,course_name依赖于course_id,而student_name依赖于student_id。因此,不是将所有4个变量放在同一个表中,而是将它们分开。这减少了元组之间的冗余,并且也变得易于处理空值。这是第五种正常形式。在这些表格上发起查询总是很容易。

当您必须对表格进行索引时,它也很有用。因为无法为具有空值的变量编制索引。

答案 4 :(得分:-1)

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

Less tables => less joins statements =>更好的表现