【问题标题】:SQL normalizationSQL 规范化
【发布时间】:2011-06-06 06:29:20
【问题描述】:

现在,我有一张桌子:

Id  -  CollegeName   -   CourseName

此表未标准化,因此我每 1 所大学都有很多课程
我需要将其规范化为两个表:

Colleges:  CollegeID  -  CollegeName  
Courses:   CourseID  - CollegeID  - CourseName 

有没有简单的方法可以做到这一点?
谢谢

【问题讨论】:

  • 我想规范化你的意思是第三范式,但你的示例代码并没有违反这一点。没有仅依赖于 CollegeName 的字段。如果还有一个 CollegeMailingAddres 列,那将违反 3NF。
  • @Andomar 是的,但有很多原因表明这种重构仍然有益。
  • @Martin:规范化因增加复杂性而臭名昭著。进入新课程的表格现在必须接触两张桌子而不是一张。听起来还不错,但确实加起来了。
  • @Andomar - 为了获得页面上的最大行数,我宁愿重复 int 多次而不是 nvarchar(50) 或其他任何东西。此外,如果一所大学更名或需要防止其名称中出现多个细微差别,那么复杂性又如何呢?
  • 感谢大家的帮助。在这里,甚至不是更正确的问题,我真的需要这种形式:)

标签: sql sql-server-2008 normalization


【解决方案1】:
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

【讨论】:

  • 还是谢谢你,但我不得不把 ansery 交给 ypercube,他是第一个
【解决方案2】:

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

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 ;

【讨论】:

    【解决方案3】:

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

    我怀疑您需要一个进一步的表格来提供课程属性,以便您可以模拟这样一个事实,例如,杜伦大学的 B.Sc.计算机科学与哈佛的 A.B. 相当。计算机科学专业(通过属性“计算机专业”、“本科”、“国家=美国”、“国家=英国”等)。

    【讨论】:

    • 干杯,真的,但这是我需要做的非常具体的任务:)
    【解决方案4】:

    当然。

    用一个college_id(主键)列和一个用作唯一索引列的college_name 列创建一个College 表。

    只引用 Course 表中的学院 ID 列,而不是学院名称。

    【讨论】:

    • 是的,但是这个表有数千行长。我正在寻找一个简单的查询来做这件事,我知道该怎么做,只是不知道怎么做
    猜你喜欢
    • 2011-04-25
    • 2011-03-31
    • 2016-01-01
    • 2013-08-11
    • 2012-12-31
    • 2015-07-28
    • 2017-05-09
    • 2017-07-31
    • 2011-11-17
    相关资源
    最近更新 更多