Database design 用户数据的数据仓库-设计Q

Database design 用户数据的数据仓库-设计Q,database-design,data-warehouse,Database Design,Data Warehouse,如何最好地存储用户数据与日期/时间维度?用例是我试图每天、每小时存储用户操作。比如分享、喜欢、朋友等的数量。我有一个时间表和一个日期表。时间很简单——我一天中的每一小时都有一行=user_id和一列=1到24。但问题是日期。如果我每天给一个秋千,那么我一年就有365个秋千。我也不能以这种方式存档数据,因为分析也需要过去的数据。其他策略是什么?您将在维度中存储日期,然后添加计算字段,如年中的日期 在我所做的设计中,我们从未有过比一天更细粒度的时间片,但我不明白为什么不能有一个基于日期小时的时间维度

如何最好地存储用户数据与日期/时间维度?用例是我试图每天、每小时存储用户操作。比如分享、喜欢、朋友等的数量。我有一个时间表和一个日期表。时间很简单——我一天中的每一小时都有一行=user_id和一列=1到24。但问题是日期。如果我每天给一个秋千,那么我一年就有365个秋千。我也不能以这种方式存档数据,因为分析也需要过去的数据。其他策略是什么?

您将在维度中存储日期,然后添加计算字段,如年中的日期

在我所做的设计中,我们从未有过比一天更细粒度的时间片,但我不明白为什么不能有一个基于日期小时的时间维度,作为粒度

user_activity_facts(
   time_key references time_dimension(time_key)
  ,user_key references user_dimension(user_key)
  ,measure1
  ,measure2
  ,measure3
  ,primary key(time_key, user_key)
)
partition by range(time_key)(
   ...
)

开始时,您必须声明事实表的“粒度”,然后坚持它

如果谷物是一天,则
TimeKey
始终指向“23:59”键

如果谷物为一小时,则
TimeKey
指向“HH:59”条目

如果颗粒为一分钟,则
TimeKey
指向相应的“HH:MM”

如果谷物为15分钟,则
TimeKey
指向相应的“HH:14”、“HH:29”、“HH:44”、“HH:59”

等等

-- How many new friends did specific user gain
-- in first three months of years 2008, 2009 and 2010
-- between hours 3 and 5 in the morning
-- by day of week
-- not counting holidays ?

select
      DayOfWeek
    , sum(NewFriends) as FriendCount
from factUserAction as f
join dbo.dimUser    as u on u.UserKey = f.UserKey
join dbo.dimDate    as d on d.DateKey = f.DateKey
join dbo.dimTime    as t on t.TimeKey = f.TimeKey
where CalendarYear between 2008 and 2010
  and MonthNumberInYear between 1 and 3
  and t.Hour between 3 and 5
  and d.IsHoliday = 'no'
  and UserEmail = 'john_doe@gmail.com' 
group by DayOfWeek
order by DayOfWeek ;

嗯,那可能行得通,我需要画一点地图。所以假设我在下午1:00到2:00有60个维度,这意味着要输出下午1点到2点之间的所有活动,我需要在查询中有60个“where”来捕获每分钟?这也意味着如果我每天需要每小时或每分钟更新,那么我每年将有525600个维度行?我假设每年都有它自己的表格是正确的?我怀疑如果你去亚小时,你会得到明显的“压缩”。用户每小时执行多少活动?你的术语有点不恰当。你只有一个维度。每行表示特定日期的特定小时。要输出上周五18:00到20:00之间的所有活动,您需要执行“日期'2011-02-04 18:00:00'和日期'2011-02-04 20:00:00'之间的xx”操作。即使不是大多数DBMS,也有许多DBMS支持不同的日期和时间类型。对日期和时间有单独的属性通常是有意义的。您可以有一个单独的时间维度表和日期维度,这样您就不必在日期表中创建所有额外的行。是的,您是对的。我被整天只工作的习惯惯坏了。考虑到这些数字,如果您经常按日期和小时进行查询,我所看到的将日+小时组合到一个表中的唯一优势是从维度->事实中更好地选择索引。但是大小的增加很可能会失去优势:)问题:userkey表-我需要在DW中为此使用单独的userID表,还是可以使用存储所有用户信息的同一个userID表?我假设用户id相同,这样我就可以使用相同的表了,对吗?@Rohit;DW中应该只有一个用户表——我希望我正确理解了您的问题。我想问题是:DW表应该与业务表分开,还是使用同一组表?比如说facebook。他们有用户表、照片表等,以满足网站的业务需求。然后,他们有自己的DW用于分析洞察。因此,这是一个完整的单独的表,使用这些业务的维度。由于我的站点不大,我想知道是否可以将两者(DW和业务表)合并在一起。。。这些存储的是ID还是值?我可以有一个主日期查找表,其中包含所有可能的日期组合作为主键,并将其用作FK。或者我可以在这里存储值,比如一月=第1个月,二月-第2个月,等等@Rohit,values。谷歌“金球日期维度”,这里是其中一个
http://arcanecode.com/2009/11/18/populating-a-kimball-date-dimension/
-- How many new friends did specific user gain
-- in first three months of years 2008, 2009 and 2010
-- between hours 3 and 5 in the morning
-- by day of week
-- not counting holidays ?

select
      DayOfWeek
    , sum(NewFriends) as FriendCount
from factUserAction as f
join dbo.dimUser    as u on u.UserKey = f.UserKey
join dbo.dimDate    as d on d.DateKey = f.DateKey
join dbo.dimTime    as t on t.TimeKey = f.TimeKey
where CalendarYear between 2008 and 2010
  and MonthNumberInYear between 1 and 3
  and t.Hour between 3 and 5
  and d.IsHoliday = 'no'
  and UserEmail = 'john_doe@gmail.com' 
group by DayOfWeek
order by DayOfWeek ;