線段+點 演算循環類業務

在處理很多業務時,有時會碰到“循環”這種特殊業務處理。例如:一個循環任務,IOS上的日曆循環計劃,工作日鬧鐘等等。

這裏就來剖析下,『循環』事務的相關業務邏輯處理方案。本文闡述的『循環 』等同於『重複』。

循環實際需求

部分業務在實際使用時,想要實現定期重複的場景。例如,用戶制定了一個每週二的提醒事項,或者是想建一個每週六健身的計劃清單,每隔兩月的1號繳納電費等費用。

這些需求都是『場景固定,時間循環往復』

循環是什麼

百科對其的定義是:事物週而復始地運動或變化。

具體上要結合業務點,例如循環計劃、重複提醒。其目的就是爲了讓一個週期性的事務,能夠在僅做一次的情況下,在定好規則後可以按週期出現

循環規則

一個完整循環的週期=開始點+週期+結束。

開始點通常是某一個具體的日期。

常見的循環週期的方式主要包括:日、周、月、年,有的產品還出現了『艾賓浩斯』週期。

疊加了結束的循環週期,也就限定了此循環週期的時間長度。

不同的週期,所產生的具體規則細節不同。例如:以『周』爲週期的話,需要指定是周幾,具體可見下表。

X 是循環開始點;Y 標識所選次數 ;Z 爲 截止日期。

清楚了循環的本質,接着就是要結合業務,處理業務的循環數據。

處理循環的數據

任何信息化事務的主要操作類型無非是『增、刪、改、查』四類。

『增』:雙向處理

循環數據應該少佔用資源空間,所以用時間換空間。每次循環事務的展示,都是動態組織的結果。若是用空間換時間可能帶來影響:

  1. 空間消耗大
  2. 實際查詢效率也不高

可以想象一下,若是每次設置一個循環,就根據循環規則創建一條數據,假若設置了個每天循環的計劃,光一個月的話都可能多達30條。這還僅是此業務的一條循環方案,要是多條那?所以

當業務具備『循環』時,業務的數據應該還是獨自保留的,僅是和循環子表建立關聯。

在新增數據時,就進行雙向處理:在循環表上記錄着循環的規則內容,而業務表則記錄業務數據主體。

 

『查』:虛實結合

由於循環業務的數據是分開處理的,採用的是【時間換空間】的方式。所以在展示循環業務的時候,查詢的原則是:程序化組織,邏輯上判定,展示頁優化

程序化組織:利用程序去向兩個表讀取數據,然後虛擬化出來相關的循環點。(虛擬化是指根據循環規則判斷某日是否該有數據展示,若有,則根據業務表組織出一條虛擬數據。例如:在1月1號制定了每天循環的事務,在2號這天查看時,也能看到此條事務數據,但實際上這條數據是通過程序拼裝出來的)

 

邏輯上判定:除了依靠程序拼裝點,還需邏輯檢驗比對,虛擬化的點是否有實例化過。(實例化見下文)

展示頁優化:簡單來說,就是用戶在客戶端查看時,是看不出和那些真實的業務數據的差別,看起來以及使用起來都感覺在操作實際存在的數據。

 

『改』:實例和重塑更新

對於循環類的事務,更新的方式主要是兩類:

  1. 僅更新當前
  2. 更新當前及後續

僅更新當前:在循環體中的某一時間點,僅需要更新當前的情況。例如:用戶制定了一個每週二循環的事務清單,在第3次執行時,當天事務繁多,此清單想刪掉其中一條事務,但是後面的暫時不想更改,那就需要更新當前。

因爲有些數據點是虛擬的,所以在進行更新當前時,就需要將其進行實例化,也就是新增一條,時間歸屬於當前時間點的業務數據。這也就是上文提到的邏輯上判定,在實際展示這一時間點的數據時,僅展示這一實例化的點即可。

我們可以把循環事務想象爲一個點,通過循環規則,它演變爲一段線段。在循環中途對循環業務進行的操作,都是對線段的操作。

 

更新當前及後續:從當前點開始,後面的循環內容發生了改變。這種就需要對於循環做新增,正所謂“一刀兩段”。新產生的循環就是重塑的循環。

 

『刪』:“反常態”操作

正常的業務在進行刪除時,不是進行數據的移除,就是進行數據的假刪處理,數據不會出現因爲【刪除】反而增加的情況,但是對於『循環』的業務可能就要區別對待了。

循環事務的刪除和它的更改一樣,也是具備兩項操作:

  1. 僅刪除當前
  2. 刪除當前及後續

刪除當前及後續:這個很直白,就是從某一處開始,直接截斷“扔掉”。

但是,【僅刪除當前】可就不好操作了。可能有人會想到刪除當前,直接在線段上“一刀兩段”把那個特殊點扔掉即可。我們假設這種方式叫截斷,看下截斷方式帶來的實際業務變化。

看樣子,採用截斷的方式,再進行更新操作也不會有啥影響。那假如把一段循環,在中途刪掉兩個點。例如:從1月1日到1月10日每天循環的計劃,3日和5日因爲休息,不必執行了。

當刪掉了1月3日和1月5日的事務後,然後把1月4號也刪掉,再回到1月2號想調整下循環事務內容時,會發現6號到10號的循環事務內容不跟隨變化了。這也違背了上述『查』的展示頁優化

而如果採用【補點】的方式,也就是刪除單點時,加一個覆蓋點,用於遮蓋。

上述的問題也就不存在了,但是這也造成了一個問題,明明是【刪除】操作,結果數據庫裏的數據反而增多了,資源空間佔用更多了。

這時就可以用到遞歸優化,在處理具體循環事務時,判定是否爲唯一點,若是直接進行數據清除對於有子集的則遞歸化處理,以來減少資源空間浪費。

 

總結

循環類事務,難點在於對於數據的處理上。理清楚具體業務的實際場景,以來定奪具體採用的處理方式。

上述是一個通式,部分也是個例。若是想完美解決,就要理清線段和點的關係,這裏不再贅述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章