首页 > 解决方案 > 在 PostgreSQL 中使用连接创建视图

问题描述

对于一个小型轮班管理项目,我决定尝试为我们的员工制定每周轮班时间表,基于每天 3 班的时间表,其中 1 班可以容纳多名员工。

我创建了一个员工表和一个包含轮班日期的 work_day 表,以及一天中每个轮班的 3 个连接表。

CREATE TABLE employee(
    id SERIAL PRIMARY KEY,
    "name" VARCHAR(128) NOT NULL,
    archived BOOLEAN DEFAULT FALSE
);

CREATE TABLE work_day(
    id SERIAL PRIMARY KEY,
    "date" DATE NOT NULL UNIQUE
);

CREATE TABLE morning_shift(
  employee_id INTEGER FOREIGN KEY REFERENCES employee(id),
  shift_id INTEGER FOREIGN KEY REFERENCES work_day(id),
  PRIMARY KEY(employee_id, shift_id)  
);


CREATE TABLE evening_shift(
  employee_id INTEGER FOREIGN KEY REFERENCES employee(id),
  shift_id INTEGER FOREIGN KEY REFERENCES work_day(id),
  PRIMARY KEY(employee_id, shift_id)  
);


CREATE TABLE night_shift(
  employee_id INTEGER FOREIGN KEY REFERENCES employee(id),
  shift_id INTEGER FOREIGN KEY REFERENCES work_day(id),
  PRIMARY KEY(employee_id, shift_id)  
);

我想到的计划是创建一个可以实现工作日演示的视图:

日期

早班(姓名1,姓名2)

夜班(name3, name4)

夜班(姓名5)

这样我就可以将整个工作日作为项目中的对象进行查询。问题是我在数据库方面的经验很少,事实证明这比我想象的要困难得多。过去几天我一直在努力,终于放弃了我的自我,现在我寻求你的谦虚帮助,你如何创造这样的观点。它有许多令人困惑的连接,我无法绕开它。

非常感谢您提前。

标签: databasepostgresqldatabase-designview

解决方案


正如其他人在评论中提到的那样,数据库设计还有改进的余地。但是,这是创建视图的方法,只需连接所有需要数据的表并选择所需的字段:

CREATE VIEW shifts AS
    SELECT *
    FROM work_day inner join morning_shift on work_day.id = morning_shift.shift_id
    inner join evening_shift on work_day.id = evening_shift.shift_id
    ... (more joins)

看看这个关于连接的 Postgres 教程页面


推荐阅读