2011-01-09 3 views
2

прямо сейчас, у меня есть таблица:SQL нормализации

Id - CollegeName - CourseName 

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

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

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

+0

Да, я использую MS SQL 2008 –

+2

Я полагаю, что с нормализованным вы имеете в виду 3-ю нормальную форму, но ваш примерный код не нарушает этого. Нет полей, которые зависят только от имени колледжа. Если бы был столбец CollegeMailingAddres, это нарушило бы 3NF. – Andomar

+0

@Andomar True, но есть много причин, почему этот рефакторинг по-прежнему полезен. –

ответ

2

Если создать новые таблицы 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 ; 
+0

спасибо большое, он отлично работал –

0

Несомненно.

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

Просто обратитесь к колонке college_id, а не к колледжу, в таблице «Курс».

+0

Да, но эта таблица длинна тысяч строк. Я ищу запрос, чтобы сделать это простым способом, я знаю, что делать, просто не так, как это сделать –

4
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 
+0

спасибо вам в любом случае, но я должен был дать ансеру ypercube, он был первый –

1

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

Что я подозреваю, вам нужна дополнительная таблица, чтобы дать атрибуты курсов, чтобы вы могли моделировать тот факт, что, скажем, B.Sc. Durham University в Computing Science сопоставима с A.B. Гарвардом. в области компьютерных наук (с использованием атрибутов «основные вычисления», «бакалавриат», «страна = США», «страна = Великобритания» и т. д.).

+0

ура, действительно, но это была очень конкретная задача, которую мне нужно было сделать :) –

Смежные вопросы