Перейти к основному содержанию

Наследование сущностей

Неофициальный Бета-перевод

Эта страница переведена 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
}

Все столбцы (связи, встраиваемые объекты и т.д.) из родительских сущностей (родитель может наследовать от другой сущности) будут унаследованы и созданы в конечных сущностях.

В этом примере будут созданы 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, куда будут сохраняться все экземпляры фото, вопросов и постов.

Использование встраиваемых объектов

Существует отличный способ уменьшить дублирование (используя композицию вместо наследования) — применение embedded columns. Подробнее о встраиваемых сущностях читайте здесь.