版本1:事件表
流水ID
id
对象ID
obj_id
系统编码
sys_code
网点编码
area_code
操作者工号
operator_id
源状态
source_status
事件编码
event_code
事件描述
event_desc
目标状态
target_status
创建时间
create_time
123456A111TEST_SYSTEMXXX0123777初始
001
打印
打印完成
2018-09-06 18:33:35123457A111TEST_SYSTEMQQQ0123666
打印完成
002
核销
核销完成2018-09-07 12:05:43
在记录事件的
源状态
StateA时,一开始的做法是
获取其他业务数据表中某对象的当前状态,来设置事件记录表的源状态
。但在一些业务场景下,对于同一个事件编码event_code,虽然目标状态StateB是一样的,但是源状态StateA会有很多种情况,此时如果通过业务数据表的当前状态来设置源状态的值,会十分繁琐,而且业务代码上需要知道当前状态,不够透明。
基于上面情况,我们
不再从其他业务数据表中获取某对象的当前状态,而是依赖于事件记录表前后的数据
,从版本1的表中,可看到,在按照创建时间排序的前提下,ID为123457的源状态(打印完成),就是上一条记录ID为123456的目标状态(目标状态)。所以
想要设置某对象的源状态,只要找到该对象在事件记录表中的上一条记录的目标状态即可
。
但这种方案,严重依赖于上一条记录,当有多个节点同时都往这个事件记录表插入数据时,
要对这“上一条记录”的数据进行锁定,需要采用分布式锁或者数据库锁的机制
。
再次改进:
认真想想,由于事件记录表是按照对象做动作时按时间顺序插入的,只要保证时间顺序,其实
可以不需要记录源状态,每条数据的目标状态,也相当于它上一条数据的源状态
。因此,我们对事件表进行改造,形成版本2:
版本2:事件表
流水ID
id
对象ID
obj_id
系统编码
sys_code
网点编码
area_code
操作者工号
operator_id
事件编码
event_code
事件描述
event_desc
目标状态
target_status
创建时间
create_time
123456A111TEST_SYSTEMXXX0123777
001
打印
打印完成
2018-09-06 18:33:35123457A111TEST_SYSTEMQQQ0123666
002
核销
核销完成2018-09-07 12:05:43
由于事件记录表本身的时间顺序的特性,所以版本2的表基本可以满足我们记录对象全生命周期的需求。还是版本1的需求,比如我们想知道对象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 target_status = '核销完成';
然后将上面两条sql查询出来的begin_time和end_time套入以下sql函数,即可算出相隔的分钟数
SELECT TIMESTAMPDIFF(MINUTE, begin_time, end_time);
至此,我们的事件记录流水表设计结束。
performance_schema介绍
performance_schema是运行在较低级别的用于监控MySQL Server
运行过程中的资源消耗、资源等待等情况的一个功能特性,它具有以下特点。
performance_schema提供了一种在数据库运行时实时检查Server内部执
行情况的方法。performance_schema数据库中的
表
使用performance_schema存
储引擎。该数据库主要关注数据库运行过程中的性能相关数据。
performance_schema通过监视Serv
先分享一下拉链
表
的用途、什么是拉链
表
。
通过一些小的使用场景来对拉链
表
做近一步的阐释,以及拉链
表
和常用的切片
表
的区别。
举一个具体的应用场景,来
设计
并实现一份拉链
表
,最后并通过一些例子说明如何使用我们
设计
的这张
表
(因为现在Hive的大规模使用
事件流
就是,
事件
传播的过程。
DOM中完整的
事件流
包括了三个阶段:
事件
捕获阶段、目标阶段和
事件
冒泡阶段
事件
通过捕获到达目标元素,这个时候就是目标阶段,从目标节点元素将
事件
上传到根节点的构成阶段,冒泡阶段
3、关于
事件
冒泡以及
事件
捕获
事件
冒泡,也就是自下而上,从目标触发的元素逐级向上传播,直至window对象
在阅读了this great Nettuts+ article的提示之后,我提出了一个
表
格模式,它将高度易失的数据与其他遭受严重读取的
表
进行分离,同时降低整个数据库模式所需的
表
数,但是我不是肯定这是一个好主意,因为它不遵循正常化规则,我想听听你的意见,这里是一般的想法:我有四种类型的用户建模在Class Table Inheritance结构中,在主“用户”
表
中,我存储所有用户(id,用户名,密码...
拉链
表
:维护历史状态,以及最新状态数据的一种
表
,拉链
表
根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的
记录
而已,通过拉链
表
可以很方便的还原出拉链时点的客户
记录
。
流水
表
: 对于
表
的每一个修改都会
记录
,可以用于反映实际
记录
的变更。
适用场景对比
拉链
表
通常是对账户信息的历史变动进行处理保留的结果,
流水
表
是每天的交易形成的历史;
流水
表
用于统计业务相关情况,拉链
表
用于统计账户及客户的情况
数据仓库之拉链
表
(原理、
设计
以及在Hive中的实现)
目前新功能在试点范围内上线试用,业务关心新功能的试用情况,需要对生产数据进行统计和汇总,以便跟旧功能在流程上做一些比较分析。我们需要配合的是,跟大数据团队一起,提供几个数据基
表
,其中要有
一张
表
,能够
记录
新功能的全生命周期。
统一抽象来说,解决的是:
谁(Who)什么时候(When)以什么身份(Role)在什么地点(Where),对什么东西(What)...