2012-05-01 7 views
2

私は 'manager_id'を必要とする2つのテーブルを持つSQLデータベースを設計しています。 「従業員」テーブルと「施設」テーブル。マネージャーは従業員とみなされるので、私は別の「マネージャー」テーブルを用意するのか、単にそれを「従業員」テーブルに統合するべきかはわかりません。私はSQLに新しいので、このようなケースについてはわからない。これは、これまで私が持っているコードです:テーブルを別にしたり、データを統合したりする必要がありますか?

CREATE TABLE Employees (
emp_id NUMBER(5) NOT NULL, 
emp_name VARCHAR2(20) NOT NULL, 
emp_add1 VARCHAR2(30) NOT NULL, 
emp_add2 VARCHAR2(30) NOT NULL, 
emp_add3 VARCHAR2(30), 
emp_town VARCHAR2(30), 
emp_county NUMBER(2) NOT NULL, 
emp_telno NUMBER(10), 
emp_position NUMBER(3) NOT NULL, 
emp_manager NUMBER(4), 
CONSTRAINT pk_empid PRIMARY KEY (emp_id), 
CONSTRAINT fk_empcounty FOREIGN KEY (emp_county) REFERENCES County(county_id), 
CONSTRAINT fk_empposition FOREIGN KEY (emp_position) REFERENCES Positions(position_id), 
CONSTRAINT fk_empmanager FOREIGN KEY (emp_manager) REFERENCES Manager(manager_id) 
); 

CREATE TABLE Facilities (
facility_id NUMBER(2) NOT NULL, 
facility_name VARCHAR(15) NOT NULL, 
facility_manager NUMBER(4) NOT NULL, 
CONSTRAINT pk_facilityid PRIMARY KEY (facility_id); 
CONSTRAINT fk_facilitymanager FOREIGN KEY (facility_manager) REFERENCES Manager(manager_id) 
); 
+0

何が質問ですか>? –

+0

別のマネージャのテーブルを持っているか、または従業員テーブル – adohertyd

+0

にマネージャを含めるべきですか。私の好みは、 'employee'の' manager_id'の自己参照を 'emp_id'と' employee'に戻すことですが、気に入らなければ別のテーブルがあります。 – Ben

答えて

4

これはrelational normalisation(リレーショナルデータベース内のデータの編成)についての質問です。

それでは、どのように整理する:

最も効率的な構造を生成することを目的と正規化には多くのステップがあるまあけれども。あなたの場合は、最初に、共通のビットを同じテーブルに入れ、非共通のビットは別のビットに入れるべきです。

このように、マネージャーは従業員です(従業員のタイトル、名前、部門の属性を持つことができます)。これは従業員テーブルにある必要があります。しかし、管理者がマネージャー以外のクリップボード(属性の色やサイズなど)を持っていないと言うことができます。この場合、Managerテーブルを追加してそれらを処理します。

-- employeee table 
id Name  Title  Dept 
1 adohertyd Coder  IT 
2 Preet  Ninja  SillyWalks 
3 Skeety Secretary Cleaning 

-- manager table 
manager_id employee_id clipboard_size clipboard_colour 
1   2   Big    Black 

ザ・あなたはそれがより効率的な従業員テーブルにこれらの属性のいくつかを持って見つけることができ、さらに行くと「Is_manager」列を持っているとして、あなたはこの

select Name, Dept, clipboard_size 
from employee e 
inner join manager m on e.id = m.employee_id 

などのマネージャーを見つけるだろう。これは本質的に非正規化であり、必要となるまで避けるべきものです。

+0

私の場合は、それぞれのファシリティにマネージャがあるため、マネージャテーブルを用意する必要がありますか?あれは正しいですか? – adohertyd

+0

これが唯一の「マネージャーのみ」属性であればどちらの方法もOKです。しかし、あなたが他の 'マネージャーのみ'の属性を見ているなら、今から別のテーブルを使用したいと思います。 –

+0

ありがとうございました – adohertyd

関連する問題