Index: sql/data_load.sql
===================================================================
--- sql/data_load.sql	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ sql/data_load.sql	(revision 20df1a33a74bc8c0aacbab3ab6c1e43df4734d41)
@@ -115,9 +115,9 @@
 (3, 1, 'tok_old789_stefan', '2026-01-01 00:00:00', FALSE);
 
-INSERT INTO payment (id, user_id, enrollment_id, amount) VALUES
-(1, 1, 1, 200),
-(2, 1, 2, 200),
-(3, 2, 3, 400),
-(4, 3, 4, 200);
+INSERT INTO payment (id, enrollment_id, amount) VALUES
+(1, 1, 200),
+(2, 2, 200),
+(3, 3, 400),
+(4, 4, 200);
 
 INSERT INTO major_subjects (major_id, subject_id, mandatory_semester) VALUES
Index: sql/iknow.dbml
===================================================================
--- sql/iknow.dbml	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ sql/iknow.dbml	(revision 20df1a33a74bc8c0aacbab3ab6c1e43df4734d41)
@@ -150,5 +150,4 @@
 Table project.payment {
   id integer [pk, increment]
-  user_id integer [not null]
   enrollment_id integer [not null]
   amount integer [not null]
@@ -188,5 +187,4 @@
 Ref: project.contact.user_id - project.users.id                      // has_contact (1:1)
 Ref: project.token.user_id > project.users.id                        // has_token
-Ref: project.payment.user_id > project.users.id                      // pays
 Ref: project.payment.enrollment_id > project.enrolled_semesters.id   // for_enrollment
 Ref: project.enrolled_semesters.user_id > project.users.id           // submits
Index: sql/schema.md
===================================================================
--- sql/schema.md	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ sql/schema.md	(revision 20df1a33a74bc8c0aacbab3ab6c1e43df4734d41)
@@ -111,5 +111,4 @@
     payment {
         integer id PK
-        integer user_id FK
         integer enrollment_id FK
         integer amount
@@ -136,5 +135,4 @@
     users               ||--o| contact            : has_contact
     users               ||--o{ token              : has_token
-    users               ||--o{ payment            : pays
     users               ||--o{ enrolled_semesters : submits
     users               ||--o{ user_documents     : owns
@@ -184,2 +182,5 @@
   they differ.
 - `professour_subjects` keeps the spelling used by the table in `schema_creation.sql`.
+- `payment` has no `user_id`: the student is reached through `enrollment_id`.
+  Storing it twice violated BCNF (`enrolled_id -> user_id`) and allowed a
+  payment to contradict the enrolment it refers to. Removed in Phase 5.
Index: sql/schema_creation.sql
===================================================================
--- sql/schema_creation.sql	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ sql/schema_creation.sql	(revision 20df1a33a74bc8c0aacbab3ab6c1e43df4734d41)
@@ -115,5 +115,4 @@
 CREATE TABLE payment (
     id             INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    user_id        INTEGER NOT NULL REFERENCES users (id),
     enrollment_id  INTEGER NOT NULL REFERENCES enrolled_semesters (id),
     amount         INTEGER NOT NULL
