跳转到主要内容

实体继承

具体表继承

您可以通过使用实体继承模式来减少代码中的重复。 最简单且最有效的是具体表继承。

例如,您有PhotoQuestionPost实体:

@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
}

正如您所见,所有这些实体都有共同的列:idtitledescription。 为了减少重复并产生更好的抽象,我们可以为它们创建一个名为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个表 - photoquestionpost

单表继承

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列来实现嵌入实体。 了解有关嵌入实体的更多信息,请阅读此处