Changeset 20df1a3


Ignore:
Timestamp:
09/16/26 14:48:55 (7 days ago)
Author:
Stefan-Saveski <stefansaveski19@…>
Branches:
master
Children:
f7c8acf
Parents:
1b20b22
Message:

Refactor payment model to remove redundant user_id, addressing BCNF violation in Phase 5 normalization

Files:
7 edited

Legend:

Unmodified
Added
Removed
  • iknow-api/Data/AppDbContext.cs

    r1b20b22 r20df1a3  
    290290                e.HasKey(p => p.Id);
    291291                e.Property(p => p.Id).HasColumnName("id");
    292                 e.Property(p => p.UserId).HasColumnName("user_id");
    293292                e.Property(p => p.EnrollmentInfoId).HasColumnName("enrollment_id");
    294293                e.Property(p => p.Amount).HasColumnName("amount");
    295294
    296                 e.HasOne(p => p.User)
    297                  .WithMany(u => u.Payments)
    298                  .HasForeignKey(p => p.UserId)
    299                  .OnDelete(DeleteBehavior.Cascade);
    300 
     295                // No user_id: the student comes from the enrolment. Removing it
     296                // was the BCNF fix from Phase 5 (enrolled_id -> user_id).
    301297                e.HasOne(p => p.EnrolledSemesters)
    302298                 .WithMany(es => es.Users)
  • iknow-api/Models/Payment.cs

    r1b20b22 r20df1a3  
    1 using System.ComponentModel.DataAnnotations.Schema;
    2 
    31namespace iknow_api.Models
    42{
     3    /// <summary>
     4    /// The student is reached through the enrolment: enrolled_id -> user_id.
     5    /// A user_id here would be redundant and could contradict the enrolment,
     6    /// which is the BCNF violation found during normalization (Phase 5).
     7    /// </summary>
    58    public class Payment
    69    {
    710        public int Id { get; set; }
    811
    9         public int UserId { get; set; }
    10         public User? User { get; set; }
    1112        public int EnrollmentInfoId { get; set; }
    1213        public int Amount { get; set; }
    1314        public EnrolledSemesters? EnrolledSemesters { get; set; }
    14 
    1515    }
    1616}
  • iknow-api/Models/User.cs

    r1b20b22 r20df1a3  
    2828        public ICollection<UserDocuments>? Documents { get; set; }
    2929
    30         // Named for the relationship it carries: Users 1 --pays-- N Payment.
    31         public ICollection<Payment>? Payments { get; set; }
    32 
    3330        // Users 1 --submits-- N EnrolledSemesters
    3431        public ICollection<EnrolledSemesters>? Enrolments { get; set; }
  • sql/data_load.sql

    r1b20b22 r20df1a3  
    115115(3, 1, 'tok_old789_stefan', '2026-01-01 00:00:00', FALSE);
    116116
    117 INSERT INTO payment (id, user_id, enrollment_id, amount) VALUES
    118 (1, 1, 1, 200),
    119 (2, 1, 2, 200),
    120 (3, 2, 3, 400),
    121 (4, 3, 4, 200);
     117INSERT INTO payment (id, enrollment_id, amount) VALUES
     118(1, 1, 200),
     119(2, 2, 200),
     120(3, 3, 400),
     121(4, 4, 200);
    122122
    123123INSERT INTO major_subjects (major_id, subject_id, mandatory_semester) VALUES
  • sql/iknow.dbml

    r1b20b22 r20df1a3  
    150150Table project.payment {
    151151  id integer [pk, increment]
    152   user_id integer [not null]
    153152  enrollment_id integer [not null]
    154153  amount integer [not null]
     
    188187Ref: project.contact.user_id - project.users.id                      // has_contact (1:1)
    189188Ref: project.token.user_id > project.users.id                        // has_token
    190 Ref: project.payment.user_id > project.users.id                      // pays
    191189Ref: project.payment.enrollment_id > project.enrolled_semesters.id   // for_enrollment
    192190Ref: project.enrolled_semesters.user_id > project.users.id           // submits
  • sql/schema.md

    r1b20b22 r20df1a3  
    111111    payment {
    112112        integer id PK
    113         integer user_id FK
    114113        integer enrollment_id FK
    115114        integer amount
     
    136135    users               ||--o| contact            : has_contact
    137136    users               ||--o{ token              : has_token
    138     users               ||--o{ payment            : pays
    139137    users               ||--o{ enrolled_semesters : submits
    140138    users               ||--o{ user_documents     : owns
     
    184182  they differ.
    185183- `professour_subjects` keeps the spelling used by the table in `schema_creation.sql`.
     184- `payment` has no `user_id`: the student is reached through `enrollment_id`.
     185  Storing it twice violated BCNF (`enrolled_id -> user_id`) and allowed a
     186  payment to contradict the enrolment it refers to. Removed in Phase 5.
  • sql/schema_creation.sql

    r1b20b22 r20df1a3  
    115115CREATE TABLE payment (
    116116    id             INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    117     user_id        INTEGER NOT NULL REFERENCES users (id),
    118117    enrollment_id  INTEGER NOT NULL REFERENCES enrolled_semesters (id),
    119118    amount         INTEGER NOT NULL
Note: See TracChangeset for help on using the changeset viewer.