如何在Oracle数据库中正确实现多对多关系?

4
我有一个关于实现四个表之间简单关系的问题。
employee
department
course
course_employee

我已经创建了它们,但我希望确认一下是否有可能会影响数据库设计的内容被忽略。以下是关系:

employee to department -> many to one
employee to course -> many to many

course_employee表是course和employee表之间的中介者。

以下是我的SQL语句:

CREATE TABLE employee (
  id NUMBER PRIMARY KEY,
  username VARCHAR2(20),
  password VARCHAR2(100),
  email VARCHAR2(40),
  department_id NUMBER
);

CREATE TABLE department(
  id NUMBER PRIMARY KEY,
  department_name VARCHAR2(40),
  location VARCHAR2(30)
);


ALTER TABLE employee
ADD CONSTRAINT department_id
  FOREIGN KEY (department_id)
  REFERENCES department(id);

CREATE TABLE course(
  id NUMBER PRIMARY KEY,
  course_code  VARCHAR2(20),
  course_name VARCHAR2(100),
  difficulty VARCHAR(10),
  duration NUMBER
);

CREATE TABLE course_employee (
  course_id NUMBER,
  employee_id NUMBER
);

ALTER TABLE course_employee
ADD CONSTRAINT fk_course FOREIGN KEY(course_id)
REFERENCES course(id);


ALTER TABLE course_employee
ADD CONSTRAINT fk_employee FOREIGN KEY(employee_id)
REFERENCES employee(id);

以下是从Sql Developer导出的实体关系图:

enter image description here

我想为员工添加已完成的课程,但我不确定是否可以通过某种关系来实现。能否了解数据库设计的人分享一下意见?非常感谢!


1
你的创建表语句看起来没问题 - 关于你额外要求添加已完成课程的要求 - 可以将其包含在course_employee表中,例如作为“course_status”列。 - Boneist
非常感谢您的快速回复 :) - skywalker
2个回答

4

您可以在course_employee表中跟踪员工报名的培训状态。该表可以保存与员工报名课程相关的任何数据。


你的意思是在中介表course_employee中添加一个已完成列(completed BOOLEAN)就可以解决问题了吗? - skywalker
1
我对这个设计唯一的担忧是,如果员工想要重新参加同一门课程,并且您想要跟踪像开始日期、结束日期、成绩之类的东西... - vercelli
3
这是一个课程预订解决方案的大大简化版。每个课程没有与之关联的时间段。实际上,你不会直接将参与者与某门课程关联起来,而是将课程的时间段与参与者关联起来。如果你重修一门课程,那么你将参加这门课程的不同时间段。但是记录参与者完成课程的情况应该存储在将参与者与时间段相关联的表格中。 - Shadow
你会如何处理像“primary”列这样的情况呢?例如,一个员工有5门课程,但只能有1门被标记为“primary”。这种布尔(0、1)类型的字段是否应该添加到course_employee表中呢? - undefined

1
你的course_employee表是course表和employee表之间的连接表(多对多关系)。为了使其成为多对多关系,course_id和employee_id必须同时是course_employee表的外键和主键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接