SQL规范化

SQL规范化,sql,sql-server-2008,normalization,Sql,Sql Server 2008,Normalization,现在,我有一张桌子: Id - CollegeName - CourseName 此表未规范化,因此我每1所学院有许多课程 我需要将其规范化为两个表: Colleges: CollegeID - CollegeName Courses: CourseID - CollegeID - CourseName 有没有一种简单的方法可以做到这一点? 谢谢你当然可以 创建一个包含College_id(主键)列和College_name列(用作唯一索引列)的College

现在,我有一张桌子:

Id  -  CollegeName   -   CourseName
此表未规范化,因此我每1所学院有许多课程
我需要将其规范化为两个表:

Colleges:  CollegeID  -  CollegeName  
Courses:   CourseID  - CollegeID  - CourseName 
有没有一种简单的方法可以做到这一点?
谢谢你

当然可以

创建一个包含College_id(主键)列和College_name列(用作唯一索引列)的College表


只需参考课程表中的college\u id列,而不是college\u name。

如果创建两个新表,并将Colleges.CollegeID和Courses.CourseID作为自动编号字段,则可以使用:

INSERT INTO Colleges (CollegeName)
  SELECT DISTINCT CollegeName 
    FROM OLdTable ;

INSERT INTO Courses (CollegeID, CourseName)
  SELECT Colleges.CollegeID, OldTable.CourseName 
    FROM OldTable
      JOIN Colleges
        ON OldTable.CollegeName = Colleges.CollegeName ;

我同意@Andomar的第一条评论:删除看似多余的
Id
列,您的
CollegeName,CourseName
表已经在5NF中了


我想你需要的是一个进一步的表格来给出课程属性,这样你就可以模拟这样一个事实,比如说,达勒姆大学的理学学士。在计算科学方面与哈佛大学的计算机科学学士学位相当(通过“计算专业”、“本科”、“国家=美国”、“国家=英国”等属性)。

是的,但此表有数千行。我正在寻找一个简单的查询来实现这一点,我知道该做什么,只是不知道如何做。我假设使用normalized,你指的是第三个normal form,但是你的示例代码没有违反这一点。没有仅依赖于CollegeName的字段。如果还有CollegeMailingAddress列,那将违反3NF。@Andomar是真的,但有很多原因说明这种重构仍然是有益的。@Martin:规范化以增加复杂性而臭名昭著。进入新课程的表格现在必须接触两张表格,而不是一张。听起来不算太糟糕,但它确实很有用。@Andomar-为了在页面上获得最大行数,我宁愿重复一个
int
多次,而不是一个
nvarchar(50)
或任何东西。此外,如果一所大学更改了名称,或者需要防止名称上的多个细微差异悄然出现,那么复杂性又如何呢?谢谢大家的帮助。这里,甚至没有一个关于什么更正确的问题,我真的需要这个表格:)无论如何,谢谢你,但我必须给ypercube一个答案,他是第一个干杯,真的,但这是我需要做的一个非常具体的任务:)
CREATE TABLE dbo.College
(
  CollegeId     int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
  CollegeName   nvarchar(100) NOT NULL
)

CREATE TABLE dbo.Course
(
  CourseId      int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
  CollegeId     int NOT NULL,
  CourseName    nvarchar(100) NOT NULL
)

ALTER TABLE dbo.Course
  ADD CONSTRAINT FK_Course_College FOREIGN KEY (CollegeId)
  REFERENCES dbo.College (CollegeId)

--- add colleges
INSERT INTO dbo.College (CollegeName)
SELECT DISTINCT CollegeName FROM SourceTable

--- add courses
INSERT INTO dbo.Course (CollegeId, CourseName)
SELECT
  College.CollegeId,
  SourceTable.CourseName
FROM
  SourceTable
INNER JOIN
  dbo.College ON SourceTable.CollegeName = College.CollegeName