2

我正在设计一个 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)
);
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

随着您走得更远,您可能会发现将其中一些属性带入员工表并具有“Is_manager”列更有效。这本质上是非规范化,在需要之前应该避免。

于 2012-05-01T21:01:13.707 回答