何时以及如何将任何内容的状态设置为“过期”?

问题描述 投票:0回答:2

示例:

我有一类抽象请求:

public enum RequestStatus
{
   Active,
   Cancelled,
   Expired
}

public class SomethingRequest
{
    public RequestStatus Status { get; set; }
    public DateTime Expires { get; set; }
    ...
}

我偶然发现的问题:

  1. 创建的请求状态为“有效”且到期日期
  2. 一段时间后请求过期
  3. 请求仍然存在于数据库中,且已过期且状态为“活动”

示例:

现在时间:2021年9月13日 09:56 (次日到期)

状态 过期
活跃 14/09/2021 09:56

当然,1天后检查请求是否过期的唯一方法是对照当前时间进行检查,但状态仍将是“Active”

如果“Expires”字段确定过期,如何将请求状态更改为“Expired”?

或者也许我选择了错误的方法来执行此操作并且不需要将“过期”状态存储在枚举中?最方便的方法是什么?

c# database-design
2个回答
2
投票

您有几种方法可以解决这个问题。

一个是定期运行作业(例如每小时一次),它搜索并更新数据库中的所有此类条目。但这仅与它运行的频率(例如 1 小时)一样准确,并且您可能不想运行得太频繁,否则随着表变大,可能会导致性能问题。

某些数据库支持生存时间 (TTL) 功能(例如 Mongo 和许多 Web 服务数据库)。然而,这通常会使整个记录/文档无效并在那时将其删除。这可能无法满足您的要求,而且该功能在 RDBMS 中并不常见(如果有的话?)

另一种方法是不直接将状态存储在数据库中,而只存储到期日期和一个布尔值(如果取消)。 然后,它是业务逻辑的一部分,用于根据到期日期确定实体的状态。

那么你的类可能看起来像这样。

public class SomethingRequest
{
    public RequestStatus Status { get { return IsCancelled ? RequestStatus.Cancelled : Expires > DateTime.Now ? RequestStatus.Expired : RequestStatus.Active; } }
    public DateTime Expires { get; set; }
    private bool IsCancelled { get; set; }  //Store cancelled state here

}

0
投票

在检查请求时添加验证以检查过期时间,如果请求过期则调用助手更新状态。

© www.soinside.com 2019 - 2024. All rights reserved.