为两个实体设置多对多关系装饰器与创建第三个实体?

Posted

技术标签:

【中文标题】为两个实体设置多对多关系装饰器与创建第三个实体?【英文标题】:Set Many-to-Many relationship decorator for two entities vs create a third entity? 【发布时间】:2022-01-23 13:25:32 【问题描述】:

在 TypeORM 中,假设我使用 MySQL 数据库并且有两个实体:Student 和 Course。

一个学生可以学习多门课程,一个课程可以被多个学生注册。

所以解决n-n关系有两种方法:

方法#1:official documents 建议我将@ManyToMany@JoinTable 装饰器添加到其中之一。但是,我发现在使用大型后端时很难维护代码。
// src/entity/Student.ts
@Entity()
export class Student 
  //...

// src/entity/Course.ts
@Entity()
export class Course 
  //...
  @ManyToMany(() => Student)
  @JoinTable()
  students: Student[];

方法#2:创建一个实体(如StudentCourse)将它们联系起来。 TypeORM 要求我在中间表中添加一个主键。将主键添加到架构中的所有中间表中会浪费时间,并且会增加大小容量。
// src/entity/Student.ts
@Entity()
export class Student 
  //...
  @OneToMany(type => StudentCourse, studentCourse => studentCourse.student)
  studentCourses!: StudentCourse[];

// src/entity/Course.ts
@Entity()
export class Course 
  //...
  @OneToMany(type => StudentCourse, studentCourse => studentCourse.course)
  studentCourses!: StudentCourse[];

// src/entity/StudentCourse.ts
@Entity()
export class StudentCourse 
  @PrimaryGeneratedColumn( type: "int", name: "id" )
  id!: number;

  // Some custom columns...

  @ManyToOne(type => Student, student => student.studentCourses)
  @JoinColumn([ name: "student_id", referencedColumnName: "id" ])
  student: Student;

  @ManyToOne(type => Course, course => course.studentCourses)
  @JoinColumn([ name: "course_id", referencedColumnName: "id" ])
  course: Course;


我想知道的是:我应该使用哪种方法来处理多对多关系?什么时候,为什么?它们之间的优缺点是什么?

【问题讨论】:

【参考方案1】:

对于第一种方法@ManyToMany当我们在想要建立的关系之间没有任何其他属性时,我们会使用它你的情况这种方法适合你

Ps:@ManyToMany 为我们创建关联表

2/ 我们使用第二种方法是当我们需要添加更多信息时,例如如果需要添加一个教室,日期然后创建一个新实体是必须的。

【讨论】:

以上是关于为两个实体设置多对多关系装饰器与创建第三个实体?的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB - 在两个实体之间创建多对多关系表[重复]

通过多个列在两个实体之间创建多对多关系

在 Doctrine 中创建多对多关系的最佳实践。

代码第一个约定不在实体框架6.2中的多对多关系上创建连接表

Hibernate的多对多关系

Hibernate 多对多