我对SQL比较熟悉,对如何最好地表示以下内容的实体关系图有点困惑:
假设我们有一个公司。公司有员工。员工有经理(多名员工对1名经理)。管理者是雇员(但管理者不能管理自己)。每个员工/经理可以在多个项目上(一个EMP/经理对多个项目)。此外,员工/经理在公司中有许多角色(1个EMP/经理到许多角色)。
我最困惑的是如何将经理嵌入员工内部。我是否需要包含任何约束,以确保没有经理管理自己?
下面是我到目前为止的模式(PostgreSQL):
CREATE TABLE employees
(
emp_id INTEGER PRIMARY KEY,
name VARCHAR(120) NOT NULL,
manager_id INTEGER REFERENCES managers (manager_id)
);
CREATE TABLE managers
(
manager_id INTEGER PRIMARY KEY,
name VARCHAR(120) NOT NULL
);
CREATE TABLE projects
(
project_id INTEGER PRIMARY KEY,
project_name VARCHAR(120) NOT NULL,
emp_id INTEGER REFERENCES employees (emp_id)
);
CREATE TABLE roles
(
role_id INTEGER PRIMARY KEY,
role_name VARCHAR(120) NOT NULL,
emp_id INTEGER REFERENCES employees (emp_id)
);
任何的想法和帮助都非常感谢!
我将对您的架构进行以下修改:
CREATE TABLE employees
(
emp_id INTEGER PRIMARY KEY,
name VARCHAR(120) NOT NULL,
-- instead of: manager_id INTEGER REFERENCES managers (manager_id)
manager_id INTEGER REFERENCES employees (emp_id)
);
-- ...and remove:
--CREATE TABLE managers
--(
-- manager_id INTEGER PRIMARY KEY,
-- name VARCHAR(120) NOT NULL
--);
如果您确实想将“没有manager管理自己”规则编码为DB约束,可以添加check
约束(emp_id<>manager_id
)。