2011-01-09 11 views
2

gerade jetzt, habe ich eine Tabelle:SQL Normalisierung

Id - CollegeName - CourseName 

diese Tabelle nicht normalisiert, so habe ich viele Kurse für jede 1 Hochschule
ich dies in zwei Tabellen normalisieren müssen:

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

Gibt es eine einfache Möglichkeit, dies zu tun?
Vielen Dank

+0

ja, ich benutze MS SQL 2008 –

+2

Ich nehme an, mit normalisiert meinst du 3. Normalform, aber dein Beispielcode verletzt das nicht. Es gibt keine Felder, die nur von CollegeName abhängen. Wenn es auch eine Spalte von CollegeMailingAddres gäbe, würde dies 3NF verletzen. – Andomar

+0

@Andomar True, aber es gibt viele Gründe, warum dieses Refactoring immer noch vorteilhaft ist. –

Antwort

2

Wenn Sie die zwei neuen Tabellen mit Colleges.CollegeID und Courses.CourseID als Auto nummerierte Felder erstellen, können Sie gehen mit:

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

vielen Dank, es funktionierte perfekt –

0

Sicher.

Erstellen Sie eine Collegetabelle mit einer Spalte college_id (Primärschlüssel) und einer Spalte college_name, die als eindeutige Indexspalte verwendet wird.

Beziehen Sie sich einfach auf die Spalte college_id, nicht College-Name, in der Kurstabelle.

+0

ja, aber diese Tabelle ist Tausende von Zeilen lang. Ich bin auf der Suche nach einer Abfrage, um dies auf die einfache Weise zu tun, ich weiß, was zu tun ist, einfach nicht, wie es geht –

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

danke trotzdem, aber ich musste die Antwort auf ypercube, er war die erste –

1

ich mit @ Andomar ersten Kommentar vereinbart: Entfernen Sie die scheinbar redundante Id Spalte und Ihre CollegeName, CourseName Tabelle ist bereits in 5NF.

Was ich vermute, dass Sie brauchen, ist eine weitere Tabelle, um Kursattribute zu geben, so dass Sie die Tatsache modellieren können, sagen wir, Durham University B.Sc. in Computing Science ist vergleichbar mit Harvard's A.B. in der Informatik (über Attribute 'computing major', 'Undergraduate', 'country = US,' country = UK 'usw.).

+0

Prost, wirklich, aber das war eine sehr spezifische Aufgabe, die ich tun musste :) –