2016-06-17 47 views
2

我有一個關於實現四個表之間簡單關係的問題。如何在oracle數據庫中實現多對多關係正確?

employee 
department 
course 
course_employee 

創建他們所有,但我只是想確保我不會錯過可能會損害數據庫設計的東西。這裏是關係:

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

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的導出ER圖:

enter image description here

我想補充也完成課程的員工,但我不知道這是通過一些關係實現的。能意識到DB設計的人可以分享意見嗎?非常感謝你!

+1

您的創建表語句對我來說看起來不錯 - 關於您添加完整課程的額外要求 - 可能包含在course_employee表中,可能作爲諸如「course_status」之類的列 – Boneist

+0

非常感謝您的快速回復:) – skywalker

回答

4

您可以跟蹤在course_employee表中註冊的員工的培訓狀態。此表可以保存特定於員工參加課程的任何數據。

+0

你的意思是說,在mediator表course_employee中添加一列完成的BOOLEAN會做詭計嗎? – skywalker

+1

我對這個設計的唯一擔憂是,如果一個員工可以重修相同的課程,並且想要跟蹤諸如beginDate,endDate,Grade ... – vercelli

+3

@Vercelli:這是一個大大簡化的課程預訂解決方案版本。沒有與課程相關的插槽。事實上,你不會直接與參與者聯繫一門課程,你會將課程的一部分與參與者聯繫起來。如果您重修課程,那麼您將參加課程的不同位置。但是跟蹤參與者是否完成課程應該存儲在將參與者與插槽關聯的表格中。 – Shadow