49073

如何设计一张事件记录流水表(版本1)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u011692924/article/details/82422959 <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css" /><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css" />

        目前新功能在试点范围内上线试用,业务关心新功能的试用情况,需要对生产数据进行统计和汇总,以便跟旧功能在流程上做一些比较分析。我们需要配合的是,跟大数据团队一起,提供几个数据基表,其中要有一张表,能够记录新功能的全生命周期。

       统一抽象来说,解决的是:

       谁(Who)什么时候(When)以什么身份(Role)在什么地点(Where),对什么东西(What)做了什么事(Something),导致该东西从什么状态(StateA),翻转成什么状态(StateB)

       基于上面的出发点,我们想采用状态机的思路,状态A通过动作A转换成状态B(stateA + actionA = stateB),这样就可以把对象从创建、修改、到最后的核销,整个生命周期过程都有对应的事件记录。

一开始,我们设计了如下版本1的表:

<table border="1" cellpadding="1" cellspacing="1"><caption>版本1:事件记录表 db_event_report</caption> <tbody><tr><td style="width:58px;">

流水ID

id

</td> <td style="width:40px;">

对象ID

obj_id

</td> <td style="width:134px;">

系统编码

sys_code

</td> <td style="width:43px;">

网点编码

area_code

</td> <td style="width:38px;">

操作者工号

operator_id

</td> <td style="width:47px;">

源状态

source_status

</td> <td style="width:57px;">

事件编码

event_code

</td> <td style="width:64px;">

事件描述

event_desc

</td> <td style="width:67px;">

目标状态

target_status

</td> <td style="width:77px;">

创建时间

create_time

</td> </tr><tr><td style="width:58px;">123456</td> <td style="width:40px;">A111</td> <td style="width:134px;">TEST_SYSTEM</td> <td style="width:43px;">XXX</td> <td style="width:38px;">0123777</td> <td style="width:47px;">初始</td> <td style="width:57px;">001</td> <td style="width:64px;">打印</td> <td style="width:67px;">打印完成</td> <td style="width:77px;">2018-09-06 18:33:35</td> </tr><tr><td style="width:58px;">123457</td> <td style="width:40px;">A111</td> <td style="width:134px;">TEST_SYSTEM</td> <td style="width:43px;">QQQ</td> <td style="width:38px;">0123666</td> <td style="width:47px;">打印完成</td> <td style="width:57px;">002</td> <td style="width:64px;">核销</td> <td style="width:67px;">核销完成</td> <td style="width:77px;">2018-09-07 12:05:43</td> </tr></tbody></table>

表字段的含义:

流水ID:与业务无关的唯一ID

对象ID:记录的操作对象,即什么东西(What)

系统编码:哪个系统上报的操作记录数据,即什么身份(Role)

网点编码:在哪个网点上报的操作记录数据,即什么地点(Where)

操作者工号:是谁操作的,即谁(Who)

源状态:在做当前这个动作时,该对象的开始状态是什么,即状态(StateA)

事件编码、事件描述:定义一系列的事件,即什么事(Something)

目标状态:当做完这个动作后,该对象的结束状态是什么,即状态(StateB)

所以基于这个表,我们可以记录某个对象在做了我们定义的一系列事件后,状态进行了翻转时的数据,然后大数据团队同步这张表,去做一些定制化的报表和数据分析。

比如我们想知道对象A111从打印完成状态到核销完成状态所花费的时间,用sql很容易就实现了:

开始时间:

SELECT create_time AS begin_time FROM db_event_report WHERE obj_id = 'A111' AND target_status = '打印完成';

结束时间:

SELECT create_time AS end_time FROM db_event_report WHERE obj_id = 'A111' AND source_status = '打印完成' AND event_code = '002';

然后将上面两条sql查询出来的begin_time和end_time套入以下sql函数,即可算出相隔的分钟数

SELECT TIMESTAMPDIFF(MINUTE, begin_time, end_time);

到此,需求初步完成。但是,就这样结束了吗?!

来源:博客园

作者:星朝

链接:https://www.cnblogs.com/jpfss/p/11424650.html

Recommend