Designing an aggregation schema
Relational DBMS is not ideally suited to this type of application.  RDBMS is great for tracking and enforcing referential integrity for relations between two entities, THING A and THING B.  What you want to do is to track relationships between THING A and every other thing in your database (or lots of other things, at least).

Your options, each of which include some form of compromise, include:


Sparse Foreign Key Columns: Create an activity table that has mutually exclusive foreign key columns that point to the various kinds of activity that you want to track.  This is a fully 3NF way of doing things, but it still requires new columns to be added for new kinds of activities and it results in sparse columns, which people try to avoid as a rule.
Forrest of Tables: Create individual activity tables each of which track a particular type of activity.  You can then create a query or view that uses UNION ALL to bring the various kinds of activity together into one place for querying.  This is also very by the book with respect to normal forms, but you end up with a database cluttered with activity tables and you have to create a new table and alter a view whenever you add a new type of activity.
Data Driven Joins: Use a single activity table that captures the type of the activity and the instance of the activity in one place.  You would need to have more sophisticated logic built for retrieval of the activity details, since this approach foregoes formal foreign keys.  There is no declarative referential integrity and the approach smells a lot like EAV, which makes many people's skin crawl.  On the other hand, you wind up with a single table, no sparse columns, and the addition of a new activity type requires no schema changes, only a tweak to one piece of code - the one that reads type of activity and knows what to do to go and retrieve the details of that activity.


You need to look at where your sensitivities are going to lie.  How many types of activity will you ultimately be tracking?  How often are new types of activity going to be added to the mix?  Are you prepared to endure the scorn of colleagues when they see you've implemented a solution with sparse columns (or worse) EAV?  When you answer these questions you'll be able to pick the approach which makes the most palatable compromises for your application.