SQL Server中现有的表设计更改

时间:2015-11-05 17:23:42

标签: sql sql-server

我现有的表结构如下:

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年)?

提前致谢

2 个答案:

答案 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)

您现在拥有一对多关系,并且您需要一个子表来处理关系的很多部分。不要将数据存储在逗号分隔的列表中。当您想要在软管表中查找数据时,这是一种完全破坏性能的方法。这只是糟糕的设计。你需要对这些表进行标准化,我相信这就是你接受这个特定练习的原因。