Ereditarietà delle Entità
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
Ereditarietà a Tabelle Concrete
Puoi ridurre la duplicazione nel tuo codice utilizzando pattern di ereditarietà delle entità. Il più semplice ed efficace è l'ereditarietà a tabelle concrete.
Ad esempio, hai le entità 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
}
Come puoi vedere, tutte queste entità hanno colonne comuni: id, title, description.
Per ridurre la duplicazione e creare una migliore astrazione, possiamo definire una classe base chiamata Content per loro:
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
}
Tutte le colonne (relazioni, embed, ecc.) dalle entità genitore (un genitore può estendere anche altre entità) saranno ereditate e create nelle entità finali.
Questo esempio creerà 3 tabelle: photo, question e post.
Ereditarietà a Tabella Singola
TypeORM supporta anche l'ereditarietà a tabella singola. L'ereditarietà a tabella singola è un pattern in cui più classi con proprietà distinte vengono memorizzate nel database all'interno della stessa tabella.
@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
}
Questo approccio creerà un'unica tabella chiamata content, e tutte le istanze di foto, domande e post
verranno salvate in questa tabella.
Utilizzo degli Embedded
Esiste un modo eccellente per ridurre la duplicazione nella tua app (usando la composizione al posto dell'ereditarietà) tramite le embedded columns.
Scopri di più sulle entità embedded qui.