跳至主内容区

实体继承

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

具体表继承

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

例如,你有 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
}

父实体中的所有列(关联关系、嵌入对象等,父实体也可继承其他实体)都将被继承并最终体现在实体中。

此示例将创建三个表: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 的单个表,所有照片、问题和帖子的实例都将保存在此表中。

使用嵌入式对象

通过embedded columns(采用组合优于继承原则)是减少应用重复代码的绝佳方式。详细了解嵌入式实体请参阅此处