专注于中国的商业智能

导航

KDT#35 时间跨度的建模(一)

在过去的一些年里,我们看到很多对时间跨度的需求。一般来说,我的事实表中每条记录保存的数据都是在一段时间内不会发生变化的。也就是说,需要的时间跨度可以在任意的时间点开始和结束。有时,我们保存的记录中时间跨度可以很好的连续在一起,但是有时也可能会出现中断的情况,更差的情况下,数据跨度可能会出现重复的情况。

这些时间跨度在数据库中都以单条记录的形式进行保存。为了能更形象的表示这些变化,我们来考虑一个例子。假设我们有一个保存着原子事务信息的数据库,如银行帐户的存款和取款记录。当然也包括开户和销户的事务。这些事务中的每一个事务都隐含着定义了一段时间跨度,在这段时间内,数据值不会发生变化。存取款事务生成一条新的记录值,这条记录值直到下一次存取款才发生变化。两次事务的时间跨度可能是几秒,也可能是几个月。开户事务也定义了帐户的一个状态,这个状态只到销户后才结束。

在我们进行数据库设计前,我们先回顾一下关于时间跨度的需求问题。我们先讨论以天作为粒度的时间跨度,后面会讨论以分钟和秒做粒度的时间跨度。

常见的以天为粒度的时间跨度的问题如下。

· 查询一个给定时间跨度中的所有事务信息。

· 判断给定的一个事务是否在一个给定的时间跨度中。

· 提供用户复杂的日历导航功能来定义时间跨度并浏览该时间跨度内的事务信息,这些导航功能的范围包括季度、天、周、节假日和财政上的时间等。

对于前两个问题,我们都可以在事务事实表中增加一个时间戳字段来实现。这样,第一个问题就变为查询出这个时间戳在给定范围内的所有事务记录。第二个问题变为读取事务的时间戳,然后与给定的时间戳进行比较。第三个问题需要将时间戳换成一个日期维度表,日期维度表中包含大量的日期相关描述信息。这个日期维度表通过外键关联到事实表上。事实表中只需保存日期维度的一个键值。

在日期维度表中可以增加每一个预定义时间跨度的第一天和最后一天的标识字段,这些标识字段可以使第三个问题变得更容易完成。例如增加“是否为季度末”字段,在这个字段中,季度未那一天的记录值为“是”,其他的都为“否”。使用了具有丰富描述信息的日期维度后,用户使用BI工具时需要注意,不要再使用事实表中的时间戳字段了,而是要关联到维度表来进行约束。

posted on 2010-08-05 13:51  李梦蛟  阅读(455)  评论(0)    收藏  举报