我们如何为这些物体建模?
场景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存在。
请建议一种有效的方法来处理这些场景来建模我的框架,或者是否有任何框架可以做到这一点。
由于
答案 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的“当前”价格设置已过期,但是当该用户也会自动撤消错误被发现并纠正?
如果您认为可以这样做,那么您将如何获得旧的到期日期(您无法确定它是否为空,因为您的业务可能已经设置了某些到期日期未来的已知日期)?
您如何回应追溯更新的要求?
等。等