• 实体继承
    • 具体表继承
    • 单表继承
    • 使用嵌入式

    实体继承

    具体表继承

    你可以使用实体继承模式减少代码中的重复。 最简单和最有效的是具体的表继承。

    例如,你有PhotoQuestionPost三个实体:

    1. @Entity()
    2. export class Photo {
    3. @PrimaryGeneratedColumn()
    4. id: number;
    5. @Column()
    6. title: string;
    7. @Column()
    8. description: string;
    9. @Column()
    10. size: string;
    11. }
    1. @Entity()
    2. export class Question {
    3. @PrimaryGeneratedColumn()
    4. id: number;
    5. @Column()
    6. title: string;
    7. @Column()
    8. description: string;
    9. @Column()
    10. answersCount: number;
    11. }
    1. @Entity()
    2. export class Post {
    3. @PrimaryGeneratedColumn()
    4. id: number;
    5. @Column()
    6. title: string;
    7. @Column()
    8. description: string;
    9. @Column()
    10. viewCount: number;
    11. }

    正如你所看到的,所有这些实体都有共同的列:idtitledescription。 为了减少重复并产生更好的抽象,我们可以为它们创建一个名为Content的基类:

    1. export abstract class Content {
    2. @PrimaryGeneratedColumn()
    3. id: number;
    4. @Column()
    5. title: string;
    6. @Column()
    7. description: string;
    8. }
    1. @Entity()
    2. export class Photo extends Content {
    3. @Column()
    4. size: string;
    5. }
    1. @Entity()
    2. export class Question extends Content {
    3. @Column()
    4. answersCount: number;
    5. }
    1. @Entity()
    2. export class Post extends Content {
    3. @Column()
    4. viewCount: number;
    5. }

    来自父实体的所有列(关系,嵌入等)(父级也可以扩展其他实体)将在最终实体中继承和创建。

    这个例子将创建3个表 - photo, questionpost.

    单表继承

    TypeORM还支持单表继承。 当您有多个具有自己属性的类时,单表继承是一种模式,但是在数据库中,它们存储在同一个表中。

    1. @Entity()
    2. @TableInheritance({ column: { type: "varchar", name: "type" } })
    3. export class Content {
    4. @PrimaryGeneratedColumn()
    5. id: number;
    6. @Column()
    7. title: string;
    8. @Column()
    9. description: string;
    10. }
    1. @ChildEntity()
    2. export class Photo extends Content {
    3. @Column()
    4. size: string;
    5. }
    1. @ChildEntity()
    2. export class Question extends Content {
    3. @Column()
    4. answersCount: number;
    5. }
    1. @ChildEntity()
    2. export class Post extends Content {
    3. @Column()
    4. viewCount: number;
    5. }

    这将创建一个名为content的表,所有photos,questions和posts的实例都将保存到此表中。

    使用嵌入式

    通过使用embedded columns,可以减少应用程序中的重复(使用组合而不是继承)。 阅读有关嵌入实体的更多信息