【问题标题】:Object relational database primary keys对象关系数据库主键
【发布时间】:2016-06-04 04:55:05
【问题描述】:

我正在尝试在oracle 11g中创建一个学校招生系统的对象关系数据库,我的sql代码如下。我正在尝试编写一个查询,返回课程名称和注册该课程的学生。但是当我尝试添加另一个化学课程时,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;

【问题讨论】:

    标签: database oracle object relational


    【解决方案1】:

    这种设计违反了数据库规范化规则。 COURSE 应该只保存有关课程的信息,而不是有关注册该课程的学生的信息。 IMO 至少应该有一个 ENROLLMENT 表,其中包含对 COURSE 和 STUDENT 的引用。这被称为“联结表”。

    我将它建模如下:

    STAFF - 有关工作人员(教师/教授等)的信息 学生 - 关于学生的信息 COURSE - 有关可能教授的课程的信息 课程 - 有关课程特定实例的信息,包括课程开会的日期/时间、地点和教授课程的工作人员。 CLASS_ENROLLMENT - 将 STUDENT 与特定的 CLASS 相关联。

    这里也应该有一些关于 ROOM、ROOM_SCHEDULE 和一个 ACADEMIC_CALENDAR 的内容。

    祝你好运。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        由于您的 course_objtab 表包含了参加课程的学生,因此 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多