# Entity Inheritance

## Concrete Table Inheritance[​](#concrete-table-inheritance "Direct link to Concrete Table Inheritance")

You can reduce duplication in your code by using entity inheritance patterns. The simplest and the most effective is concrete table inheritance.

For example, you have `Photo`, `Question`, `Post` entities:

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

}
```

As you can see all those entities have common columns: `id`, `title`, `description`. To reduce duplication and produce a better abstraction we can create a base class called `Content` for them:

```
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

}
```

All columns (relations, embeds, etc.) from parent entities (parent can extend other entity as well) will be inherited and created in final entities.

This example will create 3 tables - `photo`, `question` and `post`.

## Single Table Inheritance[​](#single-table-inheritance "Direct link to Single Table Inheritance")

TypeORM also supports single table inheritance. Single table inheritance is a pattern when you have multiple classes with their own properties, but in the database they are stored in the same table.

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

}
```

This will create a single table called `content` and all instances of photos, questions and posts will be saved into this table.

## Using embeddeds[​](#using-embeddeds "Direct link to Using embeddeds")

There is an amazing way to reduce duplication in your app (using composition over inheritance) by using `embedded columns`. Read more about embedded entities [here](https://typeorm.io/docs/entity/embedded-entities.md).
