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