Нормализация SQL - PullRequest
       11

Нормализация SQL

2 голосов
/ 10 января 2011

сейчас у меня есть таблица:

Id  -  CollegeName   -   CourseName

эта таблица не нормализована, поэтому у меня есть много курсов для каждого 1 колледжа
Мне нужно нормализовать это в две таблицы:

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

Есть ли простой способ сделать это?
Спасибо

Ответы [ 4 ]

4 голосов
/ 10 января 2011
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
2 голосов
/ 10 января 2011

Если вы создаете 2 новые таблицы с 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 ;
1 голос
/ 10 января 2011

Я согласен с первым комментарием @ Andomar: удалите, казалось бы, лишний столбец Id, и ваша таблица CollegeName, CourseName уже в 5NF.

Я подозреваю, что вам нужна дополнительная таблица, в которой указаны атрибуты курсов, чтобы вы могли смоделировать тот факт, что, например, степень бакалавра Даремского университета в вычислительной науке сравним с Гарварда А.Б. в области компьютерных наук (через атрибуты «вычислительная специальность», «бакалавриат», «страна = США», «страна = Великобритания» и т. д.).

0 голосов
/ 10 января 2011

Конечно.

Создайте таблицу College со столбцом College_id (первичный ключ) и столбцом College_name, который используется в качестве уникального столбца индекса.

Просто обратитесь к столбцу College_id, а не College_name, в таблице курса.

...