Схема Star Star для отчетов об использовании пользователями
Сценарий: есть 3 вида метрик использования, которые я получил для пользователей. В моем приложении активность пользователей отслеживается с использованием его истории входа в систему, количества обращений клиентов, совершенных пользователем, количества изменений статуса, выполненных пользователем.
Вся эта информация хранится в 3 разных таблицах в моей базе данных, например UserLoginHistory, CallHistory, OrderStatusHistory. Все действия, выполняемые каждым пользователем, хранятся в этих 3 таблицах вместе с информацией DateTime.
Теперь я пытаюсь создать базу данных отчетности, которая поможет мне в генерации общего использования пользователя. В основном отчет должен показывать меня для каждого пользователя за период:
- UserName
- Роль
- Количество логинов
- Количество совершенных звонков
- Количество выполненных обновлений статуса
Сейчас я нахожусь в процессе разработки моей таблицы фактов. Как я должен идти о создании таблицы фактов для этого сценария? Должен ли я создать единую таблицу фактов со строками в ней, фиксирующую все эти детали на уровне точной даты (на уровне моей таблицы 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 минут).
Затем, если им нужно получить более подробную информацию, вы всегда можете выполнить детализацию исходных таблиц. Хорошо, что, когда вы переходите на этот уровень, у вас должен быть только небольшой набор строк для запроса (например, всего несколько часов для определенного имени пользователя), и ваша база данных должна быть в состоянии справиться с этим.