我正在设计一个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)
);
答案 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”列更有效。这基本上是非规范化,在你需要之前你应该避免这种情况。