提问者:小点点

SQL架构设置


我对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)
);

任何的想法和帮助都非常感谢!


共1个答案

匿名用户

我将对您的架构进行以下修改:

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)。