2016-06-04 6 views
0

Ich versuche, eine objektbezogene relationale Datenbank eines Schulmeldesystems in Oracle 11g zu machen, mein SQL-Code ist unten. Ich versuche, eine Abfrage zu schreiben, die den Kursnamen und die in diesem Kurs eingeschriebenen Studenten zurückgibt. aber wenn ich versuche, einen weiteren Chemieunterricht mit der ID 101 hinzuzufügen, bekomme ich einen Fehler. Das liegt daran, dass ich KursID zu einem Primärschlüssel gemacht habe, also kann ich nicht mehrere Kurse mit dieser Kurs-ID einfügen? Kann mir also jemand zeigen, wie ich mehrere Chemie-Insert-Anweisungen mit derselben ID, aber einer anderen Studenten-ID erstellen kann?Objekt relationale Datenbank Primärschlüssel

CREATE TYPE Student_objtyp AS OBJECT (
    FName   VARCHAR2(20), 
    LName   VARCHAR2(20), 
    StudentID  NUMBER 
); 
/

CREATE TABLE Student_objtab OF Student_objtyp (StudentID PRIMARY KEY) 
    OBJECT IDENTIFIER IS PRIMARY KEY; 

CREATE TYPE Course_objtyp AS OBJECT (
    CourseName VARCHAR(20), 
    CourseID NUMBER, 
    StudentID REF Student_objtyp 
); 
/

CREATE TABLE Course_objtab OF Course_objtyp (
    PRIMARY KEY (CourseID), 
    FOREIGN KEY (StudentID) REFERENCES Student_objtab) 
    OBJECT IDENTIFIER IS PRIMARY KEY; 


INSERT INTO Student_objtab VALUES('bill','smitts',1); 
INSERT INTO Student_objtab VALUES('bob','jo',2); 


INSERT INTO Course_objtab 
SELECT 'Chemistry',101, 
REF(S) 
FROM Student_objtab S 
WHERE S.StudentID = 1; 

INSERT INTO Course_objtab 
SELECT 'Chemistry',101, 
REF(S) 
FROM Student_objtab S 
WHERE S.StudentID = 2; 

INSERT INTO Course_objtab 
SELECT 'Physics',201, 
REF(S) 
FROM Student_objtab S 
WHERE S.StudentID = 1; 

select c.CourseName, c.StudentID 
from Course_objtab c; 

Antwort

1

Dieser Entwurf ordnugsmässig Normalisierung Datenbank. KURS sollte nur Informationen über den Kurs, nicht über die Studenten in den Kurs aufgenommen enthalten. IMO sollte es mindestens eine Tabelle ENROLLMENT mit Verweisen auf KURS und STUDENT geben. Dies wird als "Junction-Tabelle" bezeichnet.

Ich würde es modellieren wie folgt:

PERSONAL - Informationen über die Mitarbeiter (Lehrer/Professoren, etc.) STUDENT - Informationen über Studenten KURS - Informationen über die Kurse, die Klasse unterrichtet werden können - Informationen über eine bestimmte Instanz eines Kurses, einschließlich der Tage/Zeiten, an denen sich die Klasse trifft, des Ortes und des Mitarbeiters, der sie unterrichtet. CLASS_ENROLLMENT - bezieht sich auf STUDENT zu einer bestimmten KLASSE.

Es sollte wahrscheinlich auch etwas über ROOM und ROOM_SCHEDULE und vielleicht ein ACADEMIC_CALENDAR hier sein.

Viel Glück.

1

Sie müssen einige Zeit damit verbringen, über die Struktur Ihrer Datenbank nachzudenken. Von dem, was Sie beschrieben haben, benötigen Sie mindestens drei Tabellen. Kurse mit PK course_id, Studenten mit PK student_id und Einschreibung mit Fremdschlüsseln course_id und student_id, die auf ihre jeweiligen Tabellen verweisen.

0

Da Ihr course_objtab Tabelle sind die Studenten, die in einem Kurs enthält, sollte die PK wahrscheinlich die courseID und StudentID sein:

CREATE TABLE Course_objtab OF Course_objtyp (
    PRIMARY KEY (CourseID, studentID), 
    FOREIGN KEY (StudentID) REFERENCES Student_objtab) 
    OBJECT IDENTIFIER IS PRIMARY KEY;