Первичные ключи объектно-реляционной базы данных

Я пытаюсь создать объектно-реляционную базу данных системы зачисления в школу в oracle 11g, мой код sql ниже. Я пытаюсь написать запрос, который возвращает название курса и студентов, зачисленных на этот курс. но когда я пытаюсь добавить еще один урок химии с идентификатором 101, я получаю сообщение об ошибке. это потому, что я сделал идентификатор курса первичным ключом, поэтому я не могу вставить несколько курсов с этим идентификатором курса? Итак, может ли кто-нибудь показать мне, как я могу создать несколько вставок по химии с одним и тем же идентификатором, но с другим идентификатором студента?

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;

person Phill    schedule 04.06.2016    source источник


Ответы (3)


Этот дизайн нарушает правила нормализации базы данных. КУРС должен содержать информацию только о курсе, а НЕ о студентах, зачисленных на курс. ИМО должна быть по крайней мере таблица ЗАЧИСЛЕНИЯ со ссылками на КУРС и СТУДЕНТ. Это известно как «стыковочная таблица».

Я бы смоделировал это следующим образом:

ПЕРСОНАЛ — информация о сотрудниках (учителях/профессорах и т. д.) СТУДЕНТ — информация о студентах КУРС — информация о курсах, которые могут преподаваться КЛАСС — информация о конкретном экземпляре курса, включая дни/время проведения занятий, местонахождение, и сотрудник, который его преподает. CLASS_ENROLLMENT — относит СТУДЕНТОВ к определенному КЛАССУ.

Вероятно, здесь должно быть что-то о ROOM, ROOM_SCHEDULE и, возможно, ACADEMIC_CALENDAR.

Удачи.

person Bob Jarvis - Reinstate Monica    schedule 05.06.2016

Вам нужно потратить некоторое время на размышления о структуре вашей базы данных. Из того, что вы описали, вам нужно как минимум три таблицы. Курсы с PK course_id, студенты с PK student_id и зачисление с внешними ключами course_id и student_id, ссылающимися на соответствующие таблицы.

person mathguy    schedule 04.06.2016

Поскольку ваша таблица course_objtab содержит студентов, зачисленных на курс, PK, вероятно, должен быть идентификатором курса и идентификатором ученика:

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