2016-06-04 1 views
0

J'essaye de faire une base de données relationnelle d'objet d'un système d'inscription scolaire dans Oracle 11g, mon code sql est ci-dessous. J'essaie d'écrire une requête qui donne le nom du cours et les étudiants inscrits à ce cours. mais quand j'essaye d'ajouter un autre cours de chimie, avec l'id 101. j'obtiens une erreur. C'est parce que j'ai fait coursID une clé primaire, donc je ne peux pas insérer plusieurs cours avec ce cours ID? Donc, quelqu'un peut-il me montrer comment je peux créer plusieurs instructions d'insertion de chimie avec le même identifiant, mais un identifiant d'étudiant différent?Clés primaires de base de données relationnelles d'objet

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; 

Répondre

1

Cette conception constitue une violation des règles de normalisation des bases de données. Le cours ne devrait contenir que des informations sur le cours, PAS sur les étudiants inscrits au cours. OMI il devrait y avoir au moins une table INSCRIPTION, avec des références à COURS et ÉTUDIANT. Ceci est connu comme une "table de jonction".

je ce modèle comme suit:

PERSONNEL - informations sur les membres du personnel (enseignants/professeurs, etc.) étudiants - informations sur les étudiants COURS - informations sur les cours qui peuvent être enseignées CLASSE - informations sur une instance spécifique d'un cours, y compris les jours/heures que la classe rencontre, l'emplacement et le membre du personnel qui l'enseigne. CLASS_ENROLLMENT - Relie les ETUDIANTS à une CLASSE spécifique.

Il devrait également probablement y avoir quelque chose ici sur ROOM, et ROOM_SCHEDULE, et peut-être un ACADEMIC_CALENDAR.

Bonne chance.

1

Vous devez prendre le temps de réfléchir à la structure de votre base de données. D'après ce que vous avez décrit, vous avez besoin d'au moins trois tables. Cours, avec PK course_id, étudiants, avec PK student_id et inscription, avec les clés étrangères course_id et student_id, référençant leurs tables respectives.

0

Étant donné que votre table course_objtab contient les élèves inscrits à un cours, le PK devrait probablement être le courseID et StudentID:

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