数据库:模拟这些要求的最佳方式?

时间:2011-08-31 07:41:42

标签: mysql database-design

我对Web应用程序中的时间表有以下要求:

  • 用户可以创建条目
  • 只能在当前月份和上个月创建和修改条目(如果它未“关闭”)。
  • 如果用户手动选择这样做,则会在当前月份或之前的第十天自动关闭一个月。

目前,我的表User和Entry具有以下属性:

用户:

  • ID
  • 名称

项:

  • ID
  • 用户ID
  • 日期
  • 开始时间
  • 结束时间
  • 注释

问题是:在数据库中建模我的需求的最佳方法是什么?

我的想法是向表User添加一个布尔字段“lastMonthIsClosed”并安排一个月度作业,该字段在每个月的第十天为所有用户设置字段为true,在第一天为所有用户设置为false每月。或者,它也可以是日期字段“lastClosedMonth”......

我想知道是否有更优雅的方法来模拟这些要求?

1 个答案:

答案 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
);

考虑对持续时间的其他限制。

  • 必须超过1分钟。
  • 必须至少6分钟。 (十分之一小时。)
  • 必须少于9小时。
  • 必须少于24小时。

您可以创建一个视图,仅向用户公开打开的条目。

向该表添加row-level BEFORE UPDATE trigger以防止更改已关闭的条目。触发器将阻止用户和数据库管理员更改已关闭的条目。行级BEFORE INSERT触发器可以阻止用户和管理员根据其时间戳插入行。

现在决定如何处理跨越一个月到下一个月的变化的时间片。