Why this matters
Your data model has two extremes. Fully normalized: every fact lives in exactly one place, connected by foreign keys. Great for writes (update once, seen everywhere), bad for reads (join 5 tables to render one page). Fully denormalized: each row has everything needed to render a view. Great for reads (single fetch), bad for writes (update in 50 places when a user changes their name).
Every real system lives somewhere in between. Getting the balance right is the difference between a snappy app with cheap writes and a slow app with terrifying update cascades.