Схема Star Star для отчетов об использовании пользователями

Сценарий: есть 3 вида метрик использования, которые я получил для пользователей. В моем приложении активность пользователей отслеживается с использованием его истории входа в систему, количества обращений клиентов, совершенных пользователем, количества изменений статуса, выполненных пользователем.

Вся эта информация хранится в 3 разных таблицах в моей базе данных, например UserLoginHistory, CallHistory, OrderStatusHistory. Все действия, выполняемые каждым пользователем, хранятся в этих 3 таблицах вместе с информацией DateTime.

Теперь я пытаюсь создать базу данных отчетности, которая поможет мне в генерации общего использования пользователя. В основном отчет должен показывать меня для каждого пользователя за период:

  1. UserName
  2. Роль
  3. Количество логинов
  4. Количество совершенных звонков
  5. Количество выполненных обновлений статуса

Сейчас я нахожусь в процессе разработки моей таблицы фактов. Как я должен идти о создании таблицы фактов для этого сценария? Должен ли я создать единую таблицу фактов со строками в ней, фиксирующую все эти детали на уровне точной даты (на уровне моей таблицы DimDate) или 3 разных таблицы фактов и связать их?

2 варианта, которые я описал выше, не убедительны, и я ищу лучший дизайн. Благодарю.

1 ответ

Решение

Как правило, когда у вас есть отчет, который использует различные факты / метрики (Number of Logins Made, Number of Calls Made, Number of Status updates Made) с той же гранулярностью (UserName, Role, Day/Hour/Minute), вы кладете их в одну таблицу фактов, чтобы избежать дорогостоящих объединений.

По многим причинам это не всегда возможно, но ваш случай кажется мне немного другим.

У вас есть три таблицы с пользовательской активностью, где, вероятно, вы храните более подробную информацию о входах в систему, вызовах и обновлениях статуса. Для вашего отчета вам нужна таблица с вашими показателями и значениями, агрегированными для необходимой вам детализации по времени.

Допустим, вам нужен отчет на уровне дня, вам нужна таблица, подобная этой:

Day        UserID RoleID #Logins #Calls #StatusUpdate
20150101   1      1      1       5      3
20150101   2      1      4       15     8

Если завтра бизнесу потребуется отчет за час, вам потребуется:

DayHour            UserID RoleID #Logins #Calls #StatusUpdate
20150101 10:00AM   1      1      1       2      1
20150101 11:00AM   1      1      0       3      2
20150101 09:00AM   2      1      2       10     4
20150101 10:00AM   2      1      2       5      4

Тогда таблица дневного уровня будет похожа на агрегированную (по дням) версию второго. Атрибут DayHour является потомком первого дня.

Если вам нужны мелкие детали, вы переходите к детализации.

Вы также можете начать напрямую со сводной таблицы на минутном уровне, но я бы дважды проверил требования с бизнесом, обычно достаточно одного часа (или 15 минут).

Затем, если им нужно получить более подробную информацию, вы всегда можете выполнить детализацию исходных таблиц. Хорошо, что, когда вы переходите на этот уровень, у вас должен быть только небольшой набор строк для запроса (например, всего несколько часов для определенного имени пользователя), и ваша база данных должна быть в состоянии справиться с этим.

Другие вопросы по тегам