Build the mental model
Normalization reduces update anomalies, duplicated facts, and inconsistent data. Instead of copying a user's email into every enrollment row, store it once in users and reference the key. Denormalization can support reporting or performance, but only with a clear source of truth and synchronization strategy.
Connect it to a real scenario
Model tutorials, lessons, and users as independent entities, with enrollment as a many-to-many bridge. Model lesson progress around an enrollment-and-lesson pair rather than duplicating user and tutorial facts.
Try the working example
users 1 ───< enrollments >─── 1 tutorials
│
└──< lesson_progress >── 1 lessons
tutorials 1 ───< lessons
Rule: each fact lives once; relationships carry foreign keys.You have an entity-relationship map for the Tutorial Platform.5-minute try-it
Model comments with an author, tutorial/lesson target, body, and timestamps without duplicating facts.
One important caution
Do not choose a normalization level by memorized rules alone. Include query patterns, integrity, and change frequency.
PostgreSQL — Data Definition — PostgreSQL Global Development Group