实体继承
非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
具体表继承
通过实体继承模式可以减少代码重复。最简单且最有效的方式是具体表继承。
例如,你有 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
}
父实体中的所有列(关联关系、嵌入对象等,父实体也可继承其他实体)都将被继承并最终体现在实体中。
此示例将创建三个表: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 的单个表,所有照片、问题和帖子的实例都将保存在此表中。
使用嵌入式对象
通过embedded columns(采用组合优于继承原则)是减少应用重复代码的绝佳方式。详细了解嵌入式实体请参阅此处。