我应该有单独的表还是整合数据?

时间:2012-05-01 20:45:24

标签: sql oracle10g foreign-keys

我正在设计一个SQL数据库,它有2个需要'manager_id'的表。 “员工”表和“设施”表。因为经理被认为是员工,我不确定我是否应该有一个单独的“经理”表或者只是将其集成到“员工”表中。我是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)
);

1 个答案:

答案 0 :(得分: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

你会找到这样的经理

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

随着您的进一步发展,您可能会发现将其中一些属性纳入员工表并拥有“Is_manager”列更有效。这基本上是非规范化,在你需要之前你应该避免这种情况。