【问题标题】:Creating views with joins in PostgreSQL在 PostgreSQL 中使用连接创建视图
【发布时间】:2021-08-05 06:35:41
【问题描述】:

对于一个小型轮班管理项目,我决定尝试为我们的员工制定每周轮班时间表,基于每天 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)

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

非常感谢您。

【问题讨论】:

  • 很抱歉,这种数据库设计从长远来看是行不通的。如果改成4班怎么办?还是从固定班次改为小时?我建议至少阅读 NF3 的数据库规范化,并在此基础上重新设计您的数据库。
  • @Polygorial 没有也不会有这样的要求你可以放心。
  • 当你只需要一张桌子时为什么要三张?使用带有移位的列,您就完成了。让事情变得复杂,通过设计使其变得脆弱,以保证错误和其他问题。
  • @DaniRashba 的要求总是随着时间而变化。除了做学校项目,在这种情况下你应该确保做正确的学习。
  • @FrankHeikens 你的想法很有道理。非常喜欢,谢谢!

标签: database postgresql database-design view


【解决方案1】:

正如 cmets 中的其他人所提到的,DB 设计还有改进的空间。但是,这是创建视图的方法,只需连接所有需要数据的表并选择所需的字段:

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 tutorial page on joins

【讨论】:

  • 您好 Dimitry,非常感谢您的回复。我结合了你和弗兰克的回应,从中得出了一些非常好的结果。因为我首先启动了 DB,所以我什至不需要修改任何代码来管理它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多