Hej, tworze platforme z kursami i zadaniami online (powiedzmy dwa typy uslug). Mam tez dwa typy konta: uczen i nauczycel. Chcialbym wprowadzic system recenzji i zastanawiam sie jak to rozwiazac z punktu widzenia baz danych. Mianowicie uczen powinien moc wystawic opinie nauczycielowi zarowno dla "kursu" i "zadania". Chcialbym latwo znalezc:

  • wszystkie oceny wystawione przez ucznia

  • wszystkie oceny otrzymane przez nauczyciela

  • wszystkie oceny przypisane do konkretnego kursu

  • wszystkie oceny przypisane do konkretnego zadania

    Dodatkowo, przy zapisywaniu i updaterowaniu kazdej recenzji, powinny sie updateowac 3 srednie w profilu nauczyciela tak zebym nie musial ich za kazdym razem osobno liczyc:

    • srednia wszystkich otrzymnych ocen
    • srednia ocen z kursow
    • srednia ocen z zadan

Myslalem zeby zrobic takie Entity dla recenzji:

@Entity()
export class ReviewEntity {
   @AfterUpdate()
   @AfterInsert()
   updateAverage() {
       const reviews = this.user.reviews;
       const grades = reviews.map(item => item.grade)
       const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length;
       this.teacher.averageGrade = average(grades);
   }

 @PrimaryGeneratedColumn('uuid')
 id: string;

 @CreateDateColumn()
 createdAt: Date;

 @UpdateDateColumn()
 updatedAt: Date;

 @Column({nullable: false})
 grade: number;

 @Column({ type: "text", default: null })
 description: string;

 @ManyToOne(() => UserEntity, (user) => user.reviews)
 user: UserEntity;

 @ManyToOne(() => UserEntity, (teacher) => teacher.reviews)
 teacher: UserEntity;

UserEntity wygladaloby tak:

@Entity()
export class UserEntity {
  // Other Columns
  ...
  @Column({ enum: Roles, default: Roles.USER })
  role: Roles;

  @Column({default: null})
  averageGrade: number;

  @OneToMany(() => ReviewEntity, (review) => review.user)
  reviews: Array<ReviewEntity>;

}

Tutaj reviews poiwinno zawierac wszystkie oceny wystawione przez uzytkownika (jesli rola uzytkownika to User) lub wszystkie oceny otrzymane przez nauczyciela. averageGrade przechowywalaby srednia ze wszystkich ocen. Poki co reviews w relacji odnosi sie do review.user, nie wiem jak to rozwiazac zeby dzialalo tez dla nauczyciela. Dodatkowo zastanawiam sie jak rozrozniac oceny kursow od zadan zeby te srednie tez policzyc. Generalnie dopiero zaczynam dzialac z bazami danych i rozwiazanie problemu ktory opisalem bardzo by mi pomogl zrozumiec niektore zasady pracy z bazami danych.