When does it make sense to duplicate data for querying I have the following table design.

an Event table, with helper tables to hold the event meta data.

each event row has an event type column (regular_event, recurring_route, timed_messages, and more.)

each event type has its own tables to define different things regarding the event - including users. The thing is that it might be referenced directly by a many to many table (users_regular_events) or by a third table or forth table (events -&gt; recurring_routes -&gt; recurring_routes_stations -&gt; recurring_stations -&gt; recurring_stations_users -&gt; users).

would it make sense to create a users_events table that duplicates relations between certain events? because, currently if I want to show each user his events I'll have to join multiple tables. Maybe I need to rethink my entire design?
My suggestion is to design the system the way it makes logical sense, and deal with problematic joins when they prove to cause performance issues. Don't prematurely optimize just because you think joins are costly. 

Joins that are performance problems are usually because the queries are horrible (which could be requirements or bad query logic), there are missing indexes, or both.