在应用程序中处理有效日期的最佳方法是什么?

时间:2010-04-06 04:05:18

标签: java hibernate design-patterns database-design data-structures

我们如何为这些物体建模?

场景1:一段时间内的价格变动

EffectiveDate  ExpiryDate    Price
2009-01-01     2009-01-31    800$
2009-02-01     Null          900$

因此,如果2009-02-15价格变为910 $,则系统应自动将之前有效价格的到期日更新至2009-02-14,以保持一致。

场景2:2009-02-01至2009-02-28之间未指定价格

EffectiveDate  ExpiryDate    Price
2009-01-01     2009-01-31    800$
2009-03-01     Null          900$

因此,如果在2009-02-15之后指定新价格,则系统应自动将记录的到期日期设置为2009-02-28,因为已经从2009-03- 01存在。

请建议一种有效的方法来处理这些场景来建模我的框架,或者是否有任何框架可以做到这一点。

由于

2 个答案:

答案 0 :(得分:1)

如果价格应该始终有效,那么我会使用单个列并使用查询来确定到期日。

Create Table Prices
(
    EffectiveDate datetime not null
    , Price decimal(15,4) not null
    , Constraint UC_Prices_EffectiveDate Unique ( EffectiveDate )
)

Select P1.EffectiveDate As Start
    , Coalesce(
                    (
                    Select Min(P2.EffectiveDate) As EffectiveDate
                    From Prices As P2
                    Where P2.EffectiveDate > P1.EffectiveDate)
                    ), '9999-12-31') As End
    , Price
From Prices As P1

以后的查询可以放入View,以便在其他查询中轻松使用。如果你试图存储开始和过期,那么你需要添加一堆代码,可能是在触发器中,而不是确保你没有重叠也没有间隙。

答案 1 :(得分:0)

我假设游戏中还有其他列可以识别“正在记录价格的内容。”

您应该非常小心系统自动执行各种更新。

如果用户为THING1注册了新价格,但却意外(因为他打算为THING2注册一个新价格):THING1的“当前”价格设置已过期,但是当该用户也会自动撤消错误被发现并纠正?

如果您认为可以这样做,那么您将如何获得旧的到期日期(您无法确定它是否为空,因为您的业务可能已经设置了某些到期日期未来的已知日期)?

您如何回应追溯更新的要求?

等。等