Active Record vs. Data Mapper
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Was ist das Active-Record-Muster?
In TypeORM können Sie sowohl das Active-Record- als auch das Data-Mapper-Muster verwenden.
Beim Active-Record-Ansatz definieren Sie alle Abfragemethoden direkt im Modell selbst. Sie speichern, entfernen und laden Objekte mithilfe von Modellmethoden.
Einfach ausgedrückt: Das Active-Record-Muster ermöglicht den Datenbankzugriff innerhalb Ihrer Modelle. Mehr über das Active-Record-Muster erfahren Sie auf Wikipedia.
Beispiel:
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
@Column()
isActive: boolean
}
Alle Active-Record-Entitäten müssen die BaseEntity-Klasse erweitern, die Methoden für den Umgang mit der Entität bereitstellt.
Beispiel für die Arbeit mit einer solchen Entität:
// example how to save AR entity
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.isActive = true
await user.save()
// example how to remove AR entity
await user.remove()
// example how to load AR entities
const users = await User.find({ skip: 2, take: 5 })
const newUsers = await User.findBy({ isActive: true })
const timber = await User.findOneBy({ firstName: "Timber", lastName: "Saw" })
BaseEntity bietet die meisten Methoden des standardmäßigen Repository.
In den meisten Fällen benötigen Sie bei Active-Record-Entitäten weder Repository noch EntityManager.
Angenommen, wir möchten eine Funktion erstellen, die Benutzer nach Vor- und Nachnamen zurückgibt.
Wir können solche Funktionen als statische Methode in der User-Klasse definieren:
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
@Column()
isActive: boolean
static findByName(firstName: string, lastName: string) {
return this.createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName })
.andWhere("user.lastName = :lastName", { lastName })
.getMany()
}
}
Und sie wie andere Methoden verwenden:
const timber = await User.findByName("Timber", "Saw")
Was ist das Data-Mapper-Muster?
In TypeORM können Sie sowohl das Active-Record- als auch das Data-Mapper-Muster verwenden.
Beim Data-Mapper-Ansatz definieren Sie alle Abfragemethoden in separaten Klassen ("Repositories"), speichern, entfernen und laden Objekte über Repositories. Bei Data Mapper sind Ihre Entitäten sehr schlank - sie definieren lediglich ihre Eigenschaften und können einfache "Dummy"-Methoden enthalten.
Vereinfacht gesagt: Data Mapper ermöglicht den Datenbankzugriff über Repositories statt über Modelle. Mehr über Data Mapper erfahren Sie auf Wikipedia.
Beispiel:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
@Column()
isActive: boolean
}
Beispiel für die Arbeit mit einer solchen Entität:
const userRepository = dataSource.getRepository(User)
// example how to save DM entity
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.isActive = true
await userRepository.save(user)
// example how to remove DM entity
await userRepository.remove(user)
// example how to load DM entities
const users = await userRepository.find({ skip: 2, take: 5 })
const newUsers = await userRepository.findBy({ isActive: true })
const timber = await userRepository.findOneBy({
firstName: "Timber",
lastName: "Saw",
})
Um Standard-Repositories mit benutzerdefinierten Methoden zu erweitern, verwenden Sie das Muster für benutzerdefinierte Repositories.
Welches sollte ich wählen?
Die Entscheidung liegt bei Ihnen. Beide Strategien haben ihre Vor- und Nachteile.
Eine wichtige Überlegung in der Softwareentwicklung ist stets die Wartbarkeit unserer Anwendungen.
Der Data Mapper-Ansatz verbessert die Wartbarkeit, was besonders in größeren Anwendungen effektiv ist.
Der Active Record-Ansatz bewahrt Einfachheit, was sich ideal für kleinere Anwendungen eignet.