我有5个db表,但我遇到的问题是Student_Answer
表,我不知道是否应该在该表中包含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
学生表:
StudentId (Auto PK) StudentForename StudentSurname
1 Joe Price
2 Kyle May
3 Mark Knowles
Student_Answer表:
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
答案 0 :(得分:0)
您不仅不需要StudentAnswer表中的SessionID字段,也不需要StudentAnswerId字段。您只需要QuestionID,StudentId和StudentAnswer。您的主键是QuestionId和StudentId。
这被称为多对多关系。
答案 1 :(得分:0)
如果你这样做会违反规范化规则,所以严格来说答案是否定的。但是,这并不是说非规范化总是很糟糕。这样做的主要问题是,如果/当您忘记更新这两个数字时,检测应用程序中的问题会变得更加困难。
如果问题的会话编号一旦设置就不可能改变,那么这不是一个大问题,但是如果它可以改变然后你不在另一个表中改变它那么那就是问题......这就是为什么把它放在一个地方更好。
说了这么多,我想知道你是否将会议保持在开始的最佳位置。你能解释一下为什么会话应该与问题而不是答案或学生联系在一起吗?在不知道你的系统的情况下,我的猜测是会话应该保存在学生表而不是问题表中。
编辑:不是将SessionId添加到学生答案表,通常您要做的只是创建一个包含您需要的所有信息的视图。如果视图仅用于人类可读性,那么您甚至不需要包含id字段,而只是在视图中显示实际的会话名称。但是,如果您只是想创建一些使编码更容易的东西,那么您也可以在视图中包含该ID。