首页 > 解决方案 > SQL 架构设置

问题描述

我对 SQL 比较陌生,对如何最好地表示以下实体关系图有点困惑:

假设我们有一家公司。公司有员工。员工有经理(许多员工对 1 名经理)。经理是雇员(但经理不能管理自己)。每个员工/经理可以参与多个项目(1 个员工/经理到多个项目)。此外,员工/经理在公司有许多角色(1 位员工/经理到许多角色)。

我最困惑的是如何考虑在员工中嵌入经理。是否有任何限制我需要包括以确保没有经理管理自己?

到目前为止,这是我的模式(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)
);

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

标签: sqlpostgresql

解决方案


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

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

如果您真的想将“没有经理自己管理”规则编码为数据库约束,您可以添加一个CHECK约束 ( emp_id <> manager_id)。


推荐阅读