专注于中国的商业智能

导航

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

对于一些相对复杂的关于时间跨度的问题如下。

· 查询在一个时间跨度中的某个时间点的所有客户。

· 查询在一个时间跨度中某个给定客户的最后一个事务处理记录。

· 查询在任意个一个指定的时间点的帐户余额信息。

在下面的讨论中,我们还假定时间跨度是以天为单位。上面提到的三个问题我们可以通过在事务表中增加时间戳来回答,但是这样的话查询会非常复杂而且效率很低。例如,为了回答最有一个问题,我们需要查询在给定时间点及之前的一系列事务处理记录。使用SQL完成的话,需要嵌入相关的子查询。这样的查询不但速度慢,用户也很难使用前端工具生成。

对于这些较复杂的关于时间跨度的问题,我们可以通过在事实表记录中增加两个时间戳来处理,分别描述事务处理的起始时间和终止时间。

通过起始时间和终止时间的设计,我们可以很容易的回答前面的三个问题。

1.查询所有有效帐户的事务,检索出起始时间在时间跨度结束之前,终止时间在时间跨度开始之后的记录。

2.查询单笔事务记录,检索出起始时间在时间跨度结束之前,终止时间在时间跨度开始之后的记录。

3.查询单笔事务记录,检索出起始时间在给定时间点之前,终止时间在给定时间点之后的记录。

在前面的这写情况下,使用一个带有BETWEENSQL就可以回答问题。

这种使用两个时间戳的方法,有一个缺点。几乎在所有的情况下,我们都需要对事实表中的每条记录操作两次。第一次是当我们生成记录时,第二次是事务处理结束时。当生成记录时,终止时间我们应该设置为一个未来不会使用到的日期,这样可以避免应用程序处理NULL值。

下面我们讨论关于时间跨度最复杂的问题,查询要求到秒级时间跨度的问题。前面提到的所有问题中的时间跨度的边界都有可能是秒级的。对于这种精确的时间跨度查询问题,我们可以将两个SQL时间戳保存入事实表记录中,但是要注意不能直接使用描述信息丰富的维度表了。这两个记录起始时间和终止时间的时间戳都必须是RDBMSdatatime型的。不能使用日期维度表的原因是,当我们设计日期维度表时一般不会把年、月、日和时、分、秒设计到同一个维度表,而是分成日期维度表和时间维度表两个维度表。两个维度表联合查询这种秒级的时间跨度问题过于复杂。所以对于这种秒级的时间跨度的查询问题只能使用SQL的日期格式。

如果你喜欢坚持的话,也可以在事实表中的事务记录上设计四个时间戳。前两个时间戳使用RDBMSdatatime型字段,后两个时间戳使用日期维度的外键连接到日期维度表上。这样就可以进行更详细,更完整的分析了。通过前两个字段可以分析精确的时间跨度,通过后两个字段可以使用丰富的日期属性进行分析。

posted on 2010-08-05 13:50  李梦蛟  阅读(400)  评论(0编辑  收藏  举报