Saltar al contenido principal

Active Record vs Data Mapper

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

¿Qué es el patrón Active Record?

En TypeORM puedes usar tanto el patrón Active Record como el patrón Data Mapper.

Con el enfoque Active Record, defines todos tus métodos de consulta dentro del modelo mismo, y guardas, eliminas y cargas objetos usando métodos del modelo.

En pocas palabras, el patrón Active Record es un enfoque para acceder a tu base de datos desde tus modelos. Puedes leer más sobre el patrón Active Record en Wikipedia.

Métodos Útiles de QueryRunner

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
}

Todas las entidades active-record deben extender la clase BaseEntity, que proporciona métodos para trabajar con la entidad. Ejemplo de cómo trabajar con dicha entidad:

// 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 tiene la mayoría de los métodos del Repository estándar. La mayoría de las veces no necesitas usar Repository ni EntityManager con entidades active record.

Supongamos ahora que queremos crear una función que devuelva usuarios por nombre y apellido. Podemos crear estas funciones como un método estático en la clase User:

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()
}
}

Y usarlo como cualquier otro método:

const timber = await User.findByName("Timber", "Saw")

¿Qué es el patrón Data Mapper?

En TypeORM puedes usar tanto el patrón Active Record como el patrón Data Mapper.

Con el enfoque Data Mapper, defines todos tus métodos de consulta en clases separadas llamadas "repositories", y guardas, eliminas y cargas objetos usando repositorios. En data mapper, tus entidades son muy simples: solo definen sus propiedades y pueden tener algunos métodos básicos.

En resumen, data mapper es un enfoque para acceder a tu base de datos desde repositorios en lugar de modelos. Puedes leer más sobre data mapper en Wikipedia.

Métodos Útiles de QueryRunner

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Column()
firstName: string

@Column()
lastName: string

@Column()
isActive: boolean
}

Ejemplo de cómo trabajar con dicha entidad:

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",
})

Para extender el repositorio estándar con métodos personalizados, usa el patrón de repositorio personalizado.

¿Cuál debería elegir?

La decisión depende de ti. Ambas estrategias tienen sus pros y contras.

Algo que siempre debemos tener presente en el desarrollo de software es cómo vamos a mantener nuestras aplicaciones. El enfoque Data Mapper favorece la mantenibilidad, siendo más efectivo en aplicaciones grandes. El enfoque Active Record ayuda a mantener la simplicidad, lo cual funciona bien en aplicaciones pequeñas.