2016-03-07 39 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