2012-05-03 55 views
1

只是關於Oracle SQL中的連接表的一個簡短問題。我瞭解他們的功能和他們在「多對多」關係中的角色,但「一對多」關係又如何呢?我有兩個表格,EmployeesPositions。每個員工只能擁有一個職位,但每個職位都可以有很多員工。例如John Doe只能成爲銷售主管,但公司中有4名銷售主管。這是我如何編碼到目前爲止:連接點/橋接表Oracle SQL

CREATE TABLE Positions (
position_id NUMBER(2) NOT NULL, 
position_name VARCHAR2(25) NOT NULL, 
CONSTRAINT pk_position PRIMARY KEY(position_id) 
); 

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL, 
emp_name VARCHAR2(30) NOT NULL, 
emp_position NUMBER(2) NOT NULL, 
emp_salary NUMBER(5) NOT NULL, 
CONSTRAINT pk_employee PRIMARY KEY(emp_id), 
CONSTRAINT fk_emp_pos FOREIGN KEY (emp_position) 
REFERENCES Position(position_id) 
); 

CREATE TABLE pos_emp (
position_id NUMBER(2) NOT NULL, 
emp_id NUMBER(3) NOT NULL, 
CONSTRAINT pk_pos_emp PRIMARY KEY(position_id, emp_id) 
); 

這是正確的嗎?是否需要:
a。 Employee表中的外鍵? b。聯結表?

我想在僱員表中強制執行一個僱員到一個角色關係,同時能夠在聯結表中擁有許多僱員關係的角色。

希望這是有道理的

回答

5

你建立的關係是一個多關係。所以如果你想要一對多的話。那麼最常用的方法是跳過pos_emp並直接在Employee中擁有外鍵。使表看起來是這樣的:

CREATE TABLE Employee (
emp_id NUMBER(3) NOT NULL, 
emp_name VARCHAR2(30) NOT NULL, 
emp_position NUMBER(2) NOT NULL, 
emp_salary NUMBER(5) NOT NULL, 
position_id NUMBER(2) NOT NULL, 
... 

編輯

我有我的員工表設置一樣,在我的代碼。將僱員表中的 Position_id作爲外鍵足以使 執行每個擁有許多僱員的職位?

如果Employeeposition_id不允許null當時的你不能沒有一個位置添加一個員工。這意味着如果你試圖插入一個沒有職位的員工,你會得到一個例外,即外部關係不能滿足。

但是你需要在代碼中檢查它,這樣當你添加一個Employee時,position_id有一個值。所以如果插入沒有值,那麼你不會將插入發送到那個數據庫。因爲這是一次不必要的數據庫調用。

另一個有趣的問題是如果您刪除Employee會發生什麼?你應該刪除與該位置相關的Employee?如果答案是肯定的。您可能會考慮從位置表中進行級聯刪除。否則,你可能需要一個觸發器。

+0

我在我的代碼中設置了我的員工表。將'Employee'表中的'Position_id'作爲外鍵足以強制每個擁有多名員工的職位? – adohertyd

+0

@adohertyd:更新了答案 – Arion