我现有的表结构如下:
Students
表和列如下:
Year
Student_Id
Subject_Type_Id
Quarter
Complete_DTTM
Column1
现有数据如下:
生:
Year Student_Id Quarter Subject_Type_Id Complete_DTTM Column1
---------------------------------------------------------------------------------------
2006 1 1 1 Null x
2006 1 2 1 10/2/2006 xyz
2006 1 2 2 10/30/2006 abc
2006 1 2 3 11/20/2006 def
一名学生可以通过从DropDownList中选择单独保存每个科目来学习多个科目。
现在新要求是一个学生可以从复选框中选择多个科目,并为Column1和Complete_DTTM提供数据并保存。
新旧要求之间的区别在于用户如何从下拉列表中选择旧主题类型,只能选择一个主题,每个主题的Column1和Complete_DTTM都不同。
根据新要求,他们可以从学生的复选框中选择多个科目,而column1和Complete_DTTM对所有科目都是相同的。
新数据如下所示:
Year Student_Id Quarter Subject_Type_Id Complete_DTTM Column1
--------------------------------------------------------------------------
2015 1 1 1, 2, 3, 4 12/31/2015 abcdef
2015 1 2 1, 2, 3, 4, 5 1/1/2016 xyz
如何更改'学生'表(我可以添加新表)以支持多个主题ID并且还需要支持旧数据(如上所示2006年)?
提前致谢
答案 0 :(得分:1)
你需要制作一个只包含学生数据的表格。然后,您将需要创建一个包含主题类型数据的表。将它们链接在一起的表格。
CREATE TABLE Student (ID INT NOT NULL PRIMARY KEY, NAME VARCHAR(50) NOT NULL,n...)
为主题
创建表格CREATE TABLE Subject (ID INT NOT NULL PRIMARY KEY, Subject_Name VARCHAR(50)NOT NULL,n...)
然后你需要一张表来将这两者联系起来。
CREATE TABLE Student_Suject_Link (Student_ID INT NOT NULL, SUBJECT_ID INT NOT NULL)
链接表需要具有Student表和Subject表的外键实现。 Student_ID需要是student表中ID列的外键,对于主题表必须相同。 SUbject_ID需要是Subject表中ID的外键。这应该满足第3范式。如果您需要获取数据,则可以轻松地连接表以获得所需内容。我重新启动它似乎创造了更多的工作,但它更容易管理向表添加列表。您当然可以将您认为必要的其他字段添加到表中,只需要与ID相关联即可。希望这会有所帮助。
答案 1 :(得分:0)
您现在拥有一对多关系,并且您需要一个子表来处理关系的很多部分。不要将数据存储在逗号分隔的列表中。当您想要在软管表中查找数据时,这是一种完全破坏性能的方法。这只是糟糕的设计。你需要对这些表进行标准化,我相信这就是你接受这个特定练习的原因。