- 实体继承
- 具体表继承
- 单表继承
- 使用嵌入式
实体继承
具体表继承
你可以使用实体继承模式减少代码中的重复。 最简单和最有效的是具体的表继承。
例如,你有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的表,所有photos,questions和posts的实例都将保存到此表中。
使用嵌入式
通过使用embedded columns,可以减少应用程序中的重复(使用组合而不是继承)。
阅读有关嵌入实体的更多信息
