0

我们如何建模这些对象?在应用程序中处理有效日期的最佳方式是什么?

方案1:在一个时间段的价格变化

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

因此,如果价格变动至910 $的2009-02-15,那么系统会自动对与先前的有效价格更新截止日期到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-03-01开始生效,因此记录的有效日期将被插入到2009-02-28。

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

感谢

回答

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,这样可以很容易地在其他查询中使用以后查询。如果你试图存储开始和结束,那么你需要添加一堆代码,可能在触发器中,比确保你没有重叠或者没有差距。

+0

+1。不要尝试添加范围,只需添加值更改的地方。 – 2010-04-06 13:11:15

+0

这是一个有趣的想法,我从来没有想过我可以取消到期日期。 – panzerschreck 2010-04-06 16:29:36

+0

这种类型的决定的基础是,你可以在每次查询时计算出它,或者你可以计算出一次并存储该值。如果您使用单列方法,您将对每个查询做更多的工作。您还可以减少处理非连续或重叠部分的问题。如果创建记录的过程非常严格并且查询时间很关键,那么请使用2.如果该过程是由用户驱动的并且您不频繁查询,请使用1.没有单个正确答案。 – 2010-04-06 22:17:23

0

我假设还有其他列正在播放,以识别价格正在被记录的东西。

您应该非常小心系统自动进行各种更新。如果用户为THING1注册新价格,但意外(因为他打算为THING2注册一个新价格):THING1的'当前'价格被设置为过期,但是当这个价格也会被自动撤消错误被发现并更正?

如果您认为您可以这样做,您将如何恢复旧的过期日期(您无法确定它是否为空,因为您的业务可能会使到期日期已设置为未来的一些已知日期)?

你打算如何回应追溯更新的要求?

等等等等

+0

我确实同意自动更新对用户来说很烦,但是您能否想到一些能够接受用户输入并且同时保持系统一致性的内容? – panzerschreck 2010-04-06 16:31:06

相关问题