2016-03-07 51 views
0

我有一個狀態歷史表,其中包含一個活動的狀態。這些狀態可以是重複的。樣本表:java中的狀態流

id activity_name state  sub_state 
1  firstTask  Check  INPROGRESS 
2  firstTask  Check  FAIL 
3  secondTask  Check  INPROGRESS 
4  secondTask  Check  SUCCESS 
5  seccondTask Initiated INPROGRESS 
6  secondTask  Initiated SUCCESS 

任何有新狀態的新活動都可以隨時在系統中引入。

表中的這些狀態用於調試目的。現在我需要公開一個讀取此表的API並將這些狀態轉換爲有意義的狀態,而忽略重複。

例如,上表中應該暴露爲

First TASK: 
CHECKED --> FAILED 

Second Task: 
CHECKED --> INITIATED 

什麼辦法/設計模式應該遵循我將處理新引進的國家,它們的壓縮和轉換爲有意義的狀態。

在此先感謝。

+0

你是否需要搜索狀態或子狀態,我們是否也可以更改表格? – Kordi

+0

看看:http://stackoverflow.com/questions/34341587/how-can-i-add-states-to-my-game/34341970#34341970 –

回答

0

不同尋常方法

如果你不喜歡有疑問:給我的所有任務,其狀態檢查和分狀態失敗嘗試這種方法。將狀態和子狀態保存在數據庫的json字符串中。

id activity_name state 
1  firstTask  {'Check' : ['INPROGRESS', 'FAIL']} 
2  secondTask  {'Check' : ['INPROGRESS', 'SUCCESS'], {'Initiate' : ['INPROGRESS', 'SUCCESS']} 

關係方法

如果你喜歡它的合理方式,然後嘗試將其保存這樣的方式,或上述標準不適合。

id activity_name state  sub_state 
1  firstTask  Check  01-INPROGRESS 
2  firstTask  Check  02-FAIL 
3  secondTask  Check  01-INPROGRESS 
4  secondTask  Check  02-SUCCESS 
5  seccondTask Initiate 01-INPROGRESS 
6  secondTask  Initiate 02-SUCCESS 

所以,你可以只是有SQL查詢,如

SELECT MAX(SUB_STATE) FROM STATES WHERE activity_name = 'firstTask' and state = 'Check'; 

最多是這裏的字符串比較,所以如果你有超過99個sub_states一個狀態,然後使用003-SUCCESS,等等。你可以使用普通的int數字,但是比不上sql控制檯的進一步知識很難讀取表格。所以如果數據大小無關緊要,我寧願追加有意義的字符串。

在這兩種方法中,您都可以輕鬆引入新狀態。

+0

其實sub_state是更多然後INPROGRESS或FAIL,sub_state會很多次保存對應狀態的1級高描述。此外,我的表可以有超過10個動態任務,在這種情況下獲得最大值將不可能 – Mak

+0

@Mak這是真的,但這完全沒有問題。然後你只需創建一個新的。在這兩種方法中,您都可以創建無限的子狀態01-infront就是這個狀態的哪個子狀態首先發生,你可以有一個很好的查詢優化。狀態的最大值(SUB_STATE)不僅僅是發生此狀態的最後一個子狀態。你知道我的意思? – Kordi