# Entity Inheritance - [Concrete Table Inheritance](#concrete-table-inheritance) - [Single Table Inheritance](#single-table-inheritance) - [Using embeddeds](#using-embeddeds) ## 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: ```typescript @Entity() export class Photo { @PrimaryGeneratedColumn() id: number @Column() title: string @Column() description: string @Column() size: string } ``` ```typescript @Entity() export class Question { @PrimaryGeneratedColumn() id: number @Column() title: string @Column() description: string @Column() answersCount: number } ``` ```typescript @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: ```typescript export abstract class Content { @PrimaryGeneratedColumn() id: number @Column() title: string @Column() description: string } ``` ```typescript @Entity() export class Photo extends Content { @Column() size: string } ``` ```typescript @Entity() export class Question extends Content { @Column() answersCount: number } ``` ```typescript @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 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. ```typescript @Entity() @TableInheritance({ column: { type: "varchar", name: "type" } }) export class Content { @PrimaryGeneratedColumn() id: number @Column() title: string @Column() description: string } ``` ```typescript @ChildEntity() export class Photo extends Content { @Column() size: string } ``` ```typescript @ChildEntity() export class Question extends Content { @Column() answersCount: number } ``` ```typescript @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 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](./embedded-entities.md).