实体继承
具体表继承
您可以通过使用实体继承模式来减少代码中的重复。 最简单且最有效的是具体表继承。
例如,您有Photo
、Question
、Post
实体:
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
@Column()
size: string
}
@Entity()
export class Question {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
@Column()
answersCount: number
}
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
@Column()
viewCount: number
}
正如您所见,所有这些实体都有共同的列:id
、title
、description
。
为了减少重复并产生更好的抽象,我们可以为它们创建一个名为Content
的基类:
export abstract class Content {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
}
@Entity()
export class Photo extends Content {
@Column()
size: string
}
@Entity()
export class Question extends Content {
@Column()
answersCount: number
}
@Entity()
export class Post extends Content {
@Column()
viewCount: number
}
所有来自父实体的列(关系、嵌入等)(父实体也可以扩展其他实体)都将被继承并创建在最终实体中。
此示例将创建3个表 - photo
、question
和post
。
单表继承
TypeORM还支持单表继承。 单表继承是一种模式,当您拥有具有自己属性的多个类时,在数据库中它们存储在同一个表中。
@Entity()
@TableInheritance({ column: { type: "varchar", name: "type" } })
export class Content {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
}
@ChildEntity()
export class Photo extends Content {
@Column()
size: string
}
@ChildEntity()
export class Question extends Content {
@Column()
answersCount: number
}
@ChildEntity()
export class Post extends Content {
@Column()
viewCount: number
}
这将创建一个名为content
的单个表,并且所有的照片、问题和帖子实例将保存在该表中。
使用嵌入实体
使用嵌入实体是减少应用程序中重复的另一种绝妙方法(使用组合而不是继承)。
在TypeORM中,您可以使用embedded
列来实现嵌入实体。
了解有关嵌入实体的更多信息,请阅读此处。