如何在oracle数据库中建立多对多的关系?

时间:2018-01-29 03:58:39

标签: oracle11g oracle10g

我打算为我的部门开发一个数据库模型。我发现很难建立学生,课程和员工之间的关系,因为任何数量的学生都可以选择任意数量的课程,任何数量的员工都可以处理任意数量的课程。我怎样才能在oracle数据库中表示这些数据?

1 个答案:

答案 0 :(得分:0)

到目前为止,你做了什么?你遇到了什么样的困难?

无论如何:这是一个建议,看看是否有帮助。一个例子基于您的STUDENT和COURSES表。想法是包括映射课程和学生的附加“交叉”表,即包含制作两个表的主键的列,它们受外键约束的限制,并且它们都是新键的主键,交叉< / em> table。

以下是代码:

创建表格:

SQL> -- Students
SQL> create table t_student
  2  (id_student   number       constraint pk_stu primary key,
  3   student_name varchar2(20) not null
  4  );

Table created.

SQL> -- Courses
SQL> create table t_course
  2  (id_course    number       constraint pk_cou primary key,
  3   course_name  varchar2(20) not null
  4  );

Table created.

SQL> -- Additional "cross" table
SQL> create table t_stu_x_cou
  2  (id_student  number constraint fk_sxc_stu
  3                        references t_student (id_student),
  4   id_course   number constraint fk_sxc_cou
  5                        references t_course (id_course),
  6   constraint pk_sxc primary key (id_student, id_course)
  7  );

Table created.

插入样本数据:

SQL> insert into t_student (id_student, student_name)
  2    select 1, 'Little' from dual union
  3    select 2, 'Foot'   from dual;

2 rows created.

SQL> insert into t_course (id_course, course_name)
  2    select 100, 'Mathematics' from dual union
  3    select 200, 'Physics'     from dual union
  4    select 300, 'Chemistry'   from dual;

3 rows created.

SQL> -- Mapping students and courses:
SQL> -- - student 1 takes 2 courses (100 and 300)
SQL> -- - student 2 takes 3 courses (100, 200 and 300)
SQL> insert into t_stu_x_cou (id_student, id_course)
  2    select 1, 100 from dual union
  3    select 1, 300 from dual union
  4    --
  5    select 2, 100 from dual union
  6    select 2, 200 from dual union
  7    select 2, 300 from dual;

5 rows created.

选择显示学生1的课程:

SQL> select s.student_name, c.course_name
  2  from t_stu_x_cou x
  3  join t_student s on s.id_student = x.id_student
  4  join t_course  c on c.id_course  = x.id_course
  5  where s.id_student = 1;

STUDENT_NAME         COURSE_NAME
-------------------- --------------------
Little               Mathematics
Little               Chemistry

SQL>

现在,尝试使用相同的原则自己添加STAFF表(您将在STAFF和COURSES之间添加一个新的“交叉”表)。