我对Web应用程序中的时间表有以下要求:
目前,我的表User和Entry具有以下属性:
用户:
项:
问题是:在数据库中建模我的需求的最佳方法是什么?
我的想法是向表User添加一个布尔字段“lastMonthIsClosed”并安排一个月度作业,该字段在每个月的第十天为所有用户设置字段为true,在第一天为所有用户设置为false每月。或者,它也可以是日期字段“lastClosedMonth”......
我想知道是否有更优雅的方法来模拟这些要求?
答案 0 :(得分:0)
“已关闭”不是用户或一个月的属性。这是一个条目的属性。
create table entry (
id integer primary key,
userid integer not null,
start_time timestamp not null,
end_time timestamp not null default current_timestamp
CHECK(start_time < end_time),
notes varchar(255),
closed boolean not null default FALSE
);
考虑对持续时间的其他限制。
您可以创建一个视图,仅向用户公开打开的条目。
向该表添加row-level BEFORE UPDATE trigger以防止更改已关闭的条目。触发器将阻止用户和数据库管理员更改已关闭的条目。行级BEFORE INSERT触发器可以阻止用户和管理员根据其时间戳插入行。
现在决定如何处理跨越一个月到下一个月的变化的时间片。