sql - 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)
);
非常感谢任何想法和帮助!
解决方案
我将对您的架构进行以下修改:
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
)。
推荐阅读
- python-3.x - Dask Distributed 2021.4.1 序列化失败
- arrays - 使用 JSONArray 作为输入的 Spark Streaming [Pyspark]
- android - 基于网站在Android App上启用WebRTC
- powerbi - 卡住!DAX Measure(s) 按位置和日期计数对记录进行分组
- javascript - 尽管删除了 resize 事件侦听器,但 Chartist 图表有时会在页面调整大小时被挤压。如何防止这种情况?
- reactjs - 反应原生的货币价值
- swiftui - 当按钮文本也有图像时如何居中?
- c++ - 计算数组的大小给出变量输出
- vba - Outlook VBA 保存附件运行时错误 -2147287032 (80030008) 然后将其删除
- javascript - 为什么 babel 没有使用 webpack 将 es6 转换为 es5?