Хранилище данных для пользовательских данных - дизайн Q - PullRequest
3 голосов
/ 09 февраля 2011

Как лучше всего хранить пользовательские данные в сравнении с датой / временем? Случай использования - я пытаюсь хранить действия пользователя за день, за час. Например, количество акций, лайков, друзей и т. Д. У меня есть расписание и таблица дат. Для времени это просто - у меня есть каждая строка = user_id и colunms = от 1 до 24 для каждого часа дня. Но проблема в датах. Если я даю каждый день = 1 столбец, то у меня будет 365 столбов в год. Я также не могу архивировать данные, потому что аналитике тоже нужны прошлые данные. Каковы другие стратегии?

Ответы [ 2 ]

5 голосов
/ 09 февраля 2011

enter image description here

dimDate : 1 row per date
dimTime : 1 row per minute

Вначале вы должны указать « зерна » таблицы фактов, а затем придерживаться ее .

Если зерно составляет один день, то TimeKey всегда указывает на ключ «23:59».

Если зерно составляет один час, то TimeKey указывает на записи «HH».: 59 ".

Если зерно составляет одну минуту, то TimeKey указывает на соответствующее" ЧЧ: ММ "

Если зерно составляет 15 минут, то TimeKey указывает насоответствующие "ЧЧ: 14", "ЧЧ: 29", "ЧЧ: 44", "ЧЧ: 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 голос
/ 09 февраля 2011

Вы должны сохранить дату в измерении, а затем добавить вычисляемые поля, такие как day_of_year.

В проектах, над которыми я работал, у нас никогда не было более детальных временных интервалов, чем день, но я не могу понять, почему нельзя было измерить время на основе даты-часа, так какзерно?

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)(
   ...
)
...