【问题标题】:SQL Schema setupSQL 架构设置
【发布时间】:2019-08-03 11:21:12
【问题描述】:

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

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

【问题讨论】:

  • 不要引用项目中的员工。相反,创建一个名为“project_member”的新表,其中包含对员工和项目的引用。同样,创建一个包含角色和员工引用的“分配”表,这样您就可以拥有任意数量的角色。

标签: sql postgresql


【解决方案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
--);

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

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2016-06-22
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多