Mysql 是否需要在表中包含此字段

Mysql 是否需要在表中包含此字段,mysql,sql,database,Mysql,Sql,Database,我有5个db表,但我的问题是关于学生答案表,我不知道是否应该在该表中包含SessionId字段,因为我们将通过外键知道每个问题属于哪个会话。我想我不妨要求确保: 下表为: 会话表 SessionId (auto PK) SessionName 1 DOEEO 2 EFOEO 3 EOEOW 问题表: QuestionId (Auto PK) QuestionNo QuestionCon

我有5个db表,但我的问题是关于
学生答案
表,我不知道是否应该在该表中包含
SessionId
字段,因为我们将通过外键知道每个问题属于哪个会话。我想我不妨要求确保:

下表为:

会话表

SessionId (auto PK) SessionName
1                   DOEEO
2                   EFOEO
3                   EOEOW
问题表:

QuestionId (Auto PK) QuestionNo  QuestionContent  SessionId (Fk)
1                    1           Question 1       1
2                    2           Question 2       1
3                    3           Question 3       2
4                    4           Question 4       2           
5                    5           Question 5       3
答题表:

AnswerId (Auto PK)  Answer  QuestionId(Fk) 
1                   A       1
2                   C       1
3                   B       2
4                   C       3
5                   A       4
6                   D       5
7                   E       5
StudentAnswerId (auto PK) SessionId(FK) QuestionId (FK) StudentAnswer  StudentId (FK)
1                         1             1               C              1
2                         1             1               B              1
3                         1             1               A              2
4                         1             1               C              2
5                         1             2               C              1
6                         1             2               B              2
7                         2             3               A              1
8                         2             3               C              2
学生表:

StudentId (Auto PK)  StudentForename   StudentSurname
1                    Joe               Price
2                    Kyle              May
3                    Mark              Knowles
学生答题表:

AnswerId (Auto PK)  Answer  QuestionId(Fk) 
1                   A       1
2                   C       1
3                   B       2
4                   C       3
5                   A       4
6                   D       5
7                   E       5
StudentAnswerId (auto PK) SessionId(FK) QuestionId (FK) StudentAnswer  StudentId (FK)
1                         1             1               C              1
2                         1             1               B              1
3                         1             1               A              2
4                         1             1               C              2
5                         1             2               C              1
6                         1             2               B              2
7                         2             3               A              1
8                         2             3               C              2

您不仅不需要StudentAnswer表中的SessionID字段,也不需要StudentAnswerId字段。您只需要问题ID、学生ID和学生答案。你的主键是问号和学生号


这就是所谓的多对多关系。

如果你这样做了,它将违反规范化规则,因此严格地说,答案是否定的。然而,这并不是说反规范化总是不好的。这样做的主要问题是,如果/当您忘记更新这两个数字时,检测应用程序中的问题会变得更加困难

如果一个问题的会话号一旦设置就不可能改变,那么这不是一个大问题,但是如果它可以改变,然后你在另一个表中不改变它,那么这就是一个问题。。。这就是为什么最好把它放在一个地方

说了这么多,我想知道你是否把会议安排在最好的开始位置。你能解释一下为什么课程应该与问题而不是答案或学生联系在一起吗?在不了解您的系统的情况下,我的猜测是会话应该保存在学生表上,而不是问题表上


编辑:与将SessionId添加到学生答案表不同,您通常只需要创建一个包含所有所需信息的视图。如果该视图仅用于人类可读性,那么您甚至不需要包含id字段,而只需在视图中显示实际的会话名称。但是,如果您只是想创建一些使编码更容易的东西,那么您也可以在视图中包含id。

会话与问答不同吗?这取决于您的业务逻辑。在您的情况下,我认为在学生表中不一定要有会话id作为外键;除非您的系统需要经常通过student导航到session。如果是这种情况,那么您不需要在表
student\u Answer
上添加
SessionId
,因为您已经在
Question
表上定义了它。@JW好的,这看起来很酷,Dan也这么说嗨,我在创建主键时听到,最好每个表只包含没有意义的主键,换句话说,只包含一个字段,它是主键,是自动的,这样每一行都有自己的唯一id,我听说这样更安全。我是否有学生回答这个问题真的很重要吗?因为我已经在我的整张桌子(24张桌子)中的所有桌子上做了这个@user1881090如果你有两个名字和姓氏相同的学生,会发生什么?如果没有唯一id字段,您将如何区分它们?虽然你可以说当id没有意义时更安全,但这并不是它没有意义的主要原因。如果主键是名字和姓氏的组合怎么办;那么一旦某人的名字改变,你所有的外键会发生什么变化?主键之所以没有意义,是因为一旦设置了主键,就不应该有理由更改它。@user1881090,您确实想要一个唯一的标识符,但它必须有意义。在这种情况下,如果您为此目的添加一个字段,它允许您添加学生提交同一问题的两个答案的数据。除非现实生活允许,否则该领域弊大于利。@DanBracuk每个学生都有自己的studentId作为主键,因此,如果两个学生被称为Dave Smith,一个将是studentId 24,另一个将是34。另外,尽管我没有将其包括在上表中,但每个学生都有自己的学号,所以第一个dave smith可能是u4992,第二个dave smith可能是u3929A session是考试的另一个词。我有一个名为Student_Session的表,它使用SessionId和StudentId来确定哪些学生参加哪些课程。我已经根据问题ID设置了答案,这和下面的情况差不多