是否有任何模式可以按计划更改对象的状态?
Is there any pattern for changing the state of the object on schedule?
情况如下:
- 我需要在数据库中保留很多对象(比方说
Food
)(在我的例子中是 MySQL)。
- 每个对象都有一个 属性
State
可以枚举 "FRESH", "STALE" 或 "SPOILED".
- 每个对象都会根据某个时间表更改其状态。例如,一个对象
Bottle of milk
创建时状态为 FRESH
,但 2 天后变为 STALE
,然后在接下来的 3 天后变为 SPOILED
.
问题是:有没有什么模式可以让我控制对象的状态并相应地改变它们?例如,我可以每 30 分钟 运行 一些脚本,select 所有对象,检查它们的状态并更改它们。但是这种方法看起来不太理想,我正在尝试找出更好的方法。
编辑
运行 例行程序每 30 分钟增加一次数据库负载(因为每次我都需要 select 记录进行分析)。我正在尝试找到一个解决方案:
- 对 RDBMS 的请求最少(MySQL 在我的例子中)
- 在实际状态更改和例程开始时间之间产生最小延迟(运行每 30 分钟执行一次例程意味着某些记录最多会延迟 30 分钟更改其状态)
- 可扩展,因为可能有更多状态需要支持(这就是为什么 JB Nizet 的回答对我不起作用)
我可以使用一些智能调度程序,在内存中保留像 timestamp -> [(object_id, next_state)]
这样的有序映射(此任务最多可使用 128G)。
您不应该将状态存储在数据库中。你应该在它变质和变质的那一刻储存起来。
这样一来,您就不需要更改数据库中的任何内容。
要获得变质的物品,您只需要像
这样的查询
select * from item where now() >= spoileddate
要获取陈旧的项目,您只需要像
这样的查询
select * from item where now() >= staledate and now() < spoileddate
要获得新鲜的商品,您只需要像
这样的查询
select * from item where now() < staledate
顺便说一句,这还有另一个优势:您可以在任何给定时间了解项目的状态,而不仅仅是其当前状态。因此,如果您接到 phone 电话询问 "I ate product xyz three days ago, am I safe?",您可以接听。
如 JB Nizet 所述,状态 属性 不需要存储在数据库中。
一般来说,定期执行某些 clean-up、维护等工作的实体的设计模式称为 Agent 设计模式。
你的情况:
class FoodStateAgent
{
void Run() // called periodically from a Scheduler
{
// ...
}
};
代理通常与 调度程序 一起工作 - 类 负责 运行 在其定义的截止日期前执行特定操作。
情况如下:
- 我需要在数据库中保留很多对象(比方说
Food
)(在我的例子中是 MySQL)。 - 每个对象都有一个 属性
State
可以枚举 "FRESH", "STALE" 或 "SPOILED". - 每个对象都会根据某个时间表更改其状态。例如,一个对象
Bottle of milk
创建时状态为FRESH
,但 2 天后变为STALE
,然后在接下来的 3 天后变为SPOILED
.
问题是:有没有什么模式可以让我控制对象的状态并相应地改变它们?例如,我可以每 30 分钟 运行 一些脚本,select 所有对象,检查它们的状态并更改它们。但是这种方法看起来不太理想,我正在尝试找出更好的方法。
编辑 运行 例行程序每 30 分钟增加一次数据库负载(因为每次我都需要 select 记录进行分析)。我正在尝试找到一个解决方案:
- 对 RDBMS 的请求最少(MySQL 在我的例子中)
- 在实际状态更改和例程开始时间之间产生最小延迟(运行每 30 分钟执行一次例程意味着某些记录最多会延迟 30 分钟更改其状态)
- 可扩展,因为可能有更多状态需要支持(这就是为什么 JB Nizet 的回答对我不起作用)
我可以使用一些智能调度程序,在内存中保留像 timestamp -> [(object_id, next_state)]
这样的有序映射(此任务最多可使用 128G)。
您不应该将状态存储在数据库中。你应该在它变质和变质的那一刻储存起来。
这样一来,您就不需要更改数据库中的任何内容。
要获得变质的物品,您只需要像
这样的查询select * from item where now() >= spoileddate
要获取陈旧的项目,您只需要像
这样的查询select * from item where now() >= staledate and now() < spoileddate
要获得新鲜的商品,您只需要像
这样的查询select * from item where now() < staledate
顺便说一句,这还有另一个优势:您可以在任何给定时间了解项目的状态,而不仅仅是其当前状态。因此,如果您接到 phone 电话询问 "I ate product xyz three days ago, am I safe?",您可以接听。
如 JB Nizet 所述,状态 属性 不需要存储在数据库中。
一般来说,定期执行某些 clean-up、维护等工作的实体的设计模式称为 Agent 设计模式。
你的情况:
class FoodStateAgent
{
void Run() // called periodically from a Scheduler
{
// ...
}
};
代理通常与 调度程序 一起工作 - 类 负责 运行 在其定义的截止日期前执行特定操作。