SQL 架构设置

标签 sql postgresql

我是 SQL 的新手,对如何最好地表示以下实体关系图感到困惑:

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

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

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

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

关于SQL 架构设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57330573/

相关文章:

sql - PostgreSQL 递归 CTE - 如果发现错误值则返回空

mysql 程序 : Result consisted of more than one row with select statement

sql - Postgres - 返回 2 个 ARRAY 的交集的函数?

php - 无法通过 php 连接到数据库

c# - DateTime 列可为空时 Entity Framework 种子方法 DateTime 错误

sql - 使用基本数学函数求标准差

oracle - 将函数从 Oracle 转换为 PostgreSQL

postgresql - SQL需要很长时间才能执行

postgresql - 如何计算postgres中的百分位数

database - 通过 Perl 脚本从 Postgresql 数据库表中选择时的不同输出