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