Наследование сущностей
Эта страница переведена 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. Подробнее о встраиваемых сущностях читайте здесь.