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)
);
4

1 に答える 1

4

これは、リレーショナルの正規化(リレーショナルデータベース内のデータの編成)に関する質問です。

だからどのように整理するか:

正規化には多くのステップがありますが、最も効率的な構造を作成することを目的としています。あなたの場合、最初に共通ビットを同じテーブルに配置し、非共通ビットを別のテーブルに配置するというアプローチを試す必要があります。

したがって、飼い葉桶は従業員であるため(たとえば、従業員の役職、名前、部門の属性を使用して)、これは従業員テーブルに含まれている必要があります。しかし、マネージャーが非マネージャーにはないクリップボード(属性の色やサイズなど)を持っているとしましょう。その場合、それらを処理するために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

あなたはこのようなマネージャーを見つけるでしょう

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

さらに進むと、これらの属性の一部をemployeeテーブルに取り込み、「Is_manager」列を作成する方が効率的であることがわかります。これは本質的に非正規化であり、必要になるまで避ける必要があります。

于 2012-05-01T21:01:13.707 に答える