对象关系数据库主键

Object relational database primary keys

我正在尝试在 oracle 11g 中创建学校招生系统的对象关系数据库,我的 sql 代码如下。我正在尝试编写一个查询,返回课程名称和注册该课程的学生。但是当我尝试添加另一个化学 class,id 为 101 时。我得到一个错误。这是因为我已将 courseID 设为主键,所以我无法使用该课程 ID 插入多个课程?那么谁能告诉我如何创建多个具有相同 ID 但不同学生 ID 的化学插入语句?

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;

您需要花一些时间思考数据库的结构。根据您的描述,您至少需要三个表。具有 PK course_id 的课程、具有 PK student_id 的学生和具有外键 course_id 和 student_id 的注册,引用各自的表。

由于您的 course_objtab table 包含注册课程的学生,PK 可能应该是 courseID 和 StudentID:

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

此设计违反了数据库规范化规则。 COURSE 应该只保存关于课程的信息,而不是关于注册该课程的学生的信息。 IMO 至少应该有一个 ENROLLMENT table,其中包含课程和学生的参考资料。这被称为 "junction table".

我将其建模如下:

STAFF - 有关工作人员的信息(teachers/professors,等等) 学生 - 有关学生的信息 课程 - 有关可能教授的课程的信息 CLASS - 有关课程特定实例的信息,包括 days/times 和 class 会面、位置以及教授该课程的工作人员。 CLASS_ENROLLMENT - 将学生与特定的 CLASS.

联系起来

这里可能还应该有一些关于 ROOM 和 ROOM_SCHEDULE 的东西,也许还有一个 ACADEMIC_CALENDAR。

祝你好运。