【发布时间】: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